2015-10-06 1 views
2

J'essaye de montrer la progression de la réplication à l'utilisateur, mais jusqu'ici je ne peux pas trouver un moyen de récupérer cette information. J'utilise iOS. Je connais le changesCount et completedChangesCount de l'objet de réplication, mais vous ne pouvez pas facilement le convertir en pourcentage de progression car changesCount continue d'augmenter pendant l'exécution de la réplication. Une idée de ce qui pourrait être fait à ce sujet?Comment calculer la progression de la réplication dans CouchbaseLite sur iOS?

Docs pour changesCount: http://couchbase.github.io/couchbase-lite-ios/docs/html/interfaceCBLReplication.html#a8e2733855342bb6855df8d5b6a97ef81

Répondre

1

Si vous avez un coup d'oeil guide de lite-iOS Couchbase sur la réplication, il y a Observing and monitoring replications.

Vous pouvez la mettre en œuvre ainsi:
Objective-C

[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector(replicationChanged:) 
         name: kCBLReplicationChangeNotification 
         object: push]; 
[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector(replicationChanged:) 
         name: kCBLReplicationChangeNotification 
         object: pull]; 
- (void) replicationChanged: (NSNotification*)n { 
    // The replication reporting the notification is n.object , but we 
    // want to look at the aggregate of both the push and pull. 

    // First check whether replication is currently active: 
    BOOL active = (pull.status == kCBLReplicationActive) || (push.status == kCBLReplicationActive); 
    self.activityIndicator.state = active; 
    // Now show a progress indicator: 
    self.progressBar.hidden = !active; 
    if (active) { 
     double progress = 0.0; 
     double total = push.changesCount + pull.changesCount; 
     if (total > 0.0) { 
      progress = (push.completedChangesCount + pull.completedChangesCount)/total; 
     } 
     self.progressBar.progress = progress; 
    } 
} 

Swift:

NSNotificationCenter.defaultCenter().addObserver(self, 
    selector: "replicationChanged:", 
    name: kCBLReplicationChangeNotification, 
    object: push) 
NSNotificationCenter.defaultCenter().addObserver(self, 
    selector: "replicationChanged:", 
    name: kCBLReplicationChangeNotification, 
    object: pull) 
func replicationProgress(n: NSNotification) { 
    // The replication reporting the notification is n.object , but we 
    // want to look at the aggregate of both the push and pull. 

    // First check whether replication is currently active: 
    let active = pull.status == CBLReplicationStatus.Active || push.status == CBLReplicationStatus.Active 
    self.activityIndicator.state = active 
    // Now show a progress indicator: 
    self.progressBar.hidden = !active; 
    if active { 
     var progress = 0.0 
     let total = push.changesCount + pull.changesCount 
     let completed = push.completedChangesCount + pull.completedChangesCount 
     if total > 0 { 
      progress = Double(completed)/Double(total); 
     } 
     self.progressBar.progress = progress; 
    } 
} 

Note: Une réplication continue restera indéfiniment actif, guettant d'autres changements à se produire et les transférer. Donc, je vous recommande de lire les différents types de réplication ainsi que les indicateurs d'état de réplication.

+0

Malheureusement, cela ne fonctionne pas parce que le pull.changesCount ne cesse d'augmenter alors que la réplication est en cours, ce qui rend le pourcentage est bloqué quelque part autour de 80% pendant une longue période. Ce n'est pas fiable de cette façon. – Round

+0

Ouais! malheureusement, changesCount ne vous donne pas de valeurs totales en un coup. Le rapport de progression n'aide pas si vous voulez montrer la traction progressive, précisément. –

+0

Vous pouvez essayer de signaler un problème sur le dépôt Github ou contacter la communauté de développeurs dans [google group] (https://groups.google.com/forum/#!forum/mobile-couchbase) –

0

mise à jour swift3

func setupCBL() { 

    let manager = CBLManager.sharedInstance() 
    CBLManager.enableLogging("Sync") 

    do { 
     db = try manager.databaseNamed("tiny") 
    } catch { 
     print("no database") 
    } 


    if let url = URL(string:serverURL){ 
     pull = db?.createPullReplication(url) 

     push = db?.createPushReplication(url) 
    } 


    pull?.continuous  = true 
    push?.continuous  = true 

    NotificationCenter.default.addObserver(self, 
              selector: #selector(CBLCore.replicationChanged), 
              name: NSNotification.Name.cblReplicationChange, 
              object: push) 
    NotificationCenter.default.addObserver(self, 
              selector: #selector(CBLCore.replicationChanged), 
              name: NSNotification.Name.cblReplicationChange, 
              object: pull) 

    push?.start() 
    pull?.start() 



} 

func replicationChanged(n:Notification) { 

    if (self.push?.status == CBLReplicationStatus.active || self.pull?.status == CBLReplicationStatus.active) { 
     let completed = (self.pull?.completedChangesCount)! + (self.push?.completedChangesCount)! 
     let total  = (self.pull?.changesCount)! + (self.push?.changesCount)! 
     print("---------------------- in progress ---------------- \(completed) \\ \(total)") 
    } else { 
     if let error = self.push?.lastError ?? self.pull?.lastError{ 
      print("Error with code \(error)") 
     } 

    } 
}