2010-04-07 4 views
4

Donc je sauvegarde de petites images à des données de base qui prennent un vraiment peu de temps pour enregistrer, comme .2 secondes, mais je le fais pendant que l'utilisateur feuillette une vue de défilement afin d'améliorer la réactivité Je déplace l'économie à un fil. Cela fonctionne très bien, tout est enregistré et l'application est réactive. Cependant, il y a une chose dans le doco core-data + multithread qui m'inquiète:Sauvegarde des données de base dans un thread, comment assurer son écriture avant de quitter?

"Dans Cocoa, seul le thread principal est non-détaché.Si vous devez enregistrer sur d'autres threads, vous devez écrire un code supplémentaire tel que le thread principal empêche l'application de quitter jusqu'à ce que toute l'opération de sauvegarde soit terminée. "

Ok, comment faites-vous cela? Il ne dure que ~ .2 secondes et il est rare qu'il se produise puisque la chance de l'application de quitter est très faible. Comment puis-je exécuter quelque chose sur le thread principal qui empêchera l'application de quitter ET ne bloquera pas l'interface graphique?

Merci

Répondre

3

Faites votre fil enregistrer définir un indicateur « Enregistrer en cours », et ont le principal contrôle de fil que applicationWillTerminate du délégué de l'application: méthode. Évidemment, vous devez utiliser un mutex pour synchroniser l'accès au drapeau entre les deux threads.

Si une sauvegarde est en cours lorsque l'application tente de quitter, le thread principal effectue un pthread_cond_wait; le thread de sauvegarde le réveillera avec pthread_cond_signal une fois l'enregistrement terminé.

+0

En lisant le doco, on dirait que ça va marcher, je vais essayer! – Shizam

+1

Seriez-vous prêt à élargir votre réponse et donner un exemple? J'essaie de savoir comment configurer cela, mais je n'arrive pas à trouver un exemple. J'en ai mis un où un drapeau a été mis à false, et le "threadDone" l'a mis à vrai. A fonctionné correctement dans le simulateur, mais pas après avoir téléchargé depuis iTunes. – James

+0

@James Voici ce que j'ai fait en un mot: http://pastie.org/4663834 Ce n'est pas seulement de mettre un drapeau, c'est un drapeau d'application. Vous pouvez en savoir plus sur beginBackgroundTaskWithExpirationHandler: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html – Shizam

Questions connexes