2017-08-25 7 views
0

J'ai un CouchDB que je connecte via CouchBaseLite 1.4. J'ai de la difficulté à attendre que tous les documents soient retirés avant de continuer avec l'application.CouchbaseLite attend la fin de la réplication par tirage

Actuellement, j'accomplis cela d'une manière très hacky et je voudrais le réparer pour être mieux en conformité avec les normes de codage appropriées.

actuel:

pull.setContinuous(false); 
pull.start(); 

//Waits for pull replication to start pulling in data 
while(!pull.isRunning()); 

//Waits for pull replication to finish. 
while(!pull.getStatus().equals(Replication.ReplicationStatus.REPLICATION_STOPPED)); 

//Set continuous to true 
pull.setContinuous(true); 

//Start it again. 
pull.start(); 

La raison pour laquelle je fais ce que j'est d'avoir potentiellement 2 documents dans la base de données que je dois attendre, si elles ne sont pas présents l'application de bureau passe en mode de configuration.

  • Est-il possible d'attendre tous les documents à tirage complet sans la double while aki?
  • Mieux encore, supposons que je connais les _id des docs. Y a-t-il un moyen d'attendre que les deux soient tirés avant de continuer?

Répondre

1

Utiliser les écouteurs de modification. Pour surveiller réplications, vous voulez quelque chose comme

// Replication.ChangeListener 
@Override 
public void changed(Replication.ChangeEvent changeEvent) { 
    if (changeEvent.getError() != null) { 
    Throwable lastError = changeEvent.getError(); 
    // React to the error 
    return; 
    } 

    if (changeEvent.getTransition() == null) return; 

    ReplicationState dest = changeEvent.getTransition().getDestination(); 

    replicationActive = ((dest == ReplicationState.STOPPING || dest == ReplicationState.STOPPED) ? false : true); 

    // Do something here if true 
} 

Vous pourriez faire quelque chose de similaire avec un écouteur de modification de l'objet de base de données pour attraper lorsque les deux documents spécifiques ont été reproduites. Comme il semble que vous attendiez que ces documents soient dans la base de données après la configuration initiale ailleurs, une autre approche consisterait à effectuer une réplication unique pour obtenir ces premiers documents, puis démarrer une réplication continue après fini.

+0

Cela ne résout pas exactement mon problème, car 'changeListener' n'arrêterait pas mon thread principal de s'exécuter. Je suis allé avec votre deuxième suggestion, et utilisé une réplication en un coup pour saisir les deux docs. Il fonctionne maintenant nettement plus vite. Bien que j'aie toujours utilisé le double temps, j'attends seulement deux docs, donc la pause est minimale et acceptable, même si le code est moche. –

+0

Ah, oui, je pense généralement en termes non bloquants. Un couple d'autres pensées: Décrochez l'exécution principale via un appel dans le rappel, ou mettre le fil de dormir et le signaler à partir du rappel? – Hod