2014-04-18 2 views
3

Je suis en train de reconcevoir mon application existante du stockage CoreData dans une application basée sur un document en utilisant les sous-classes UIDocument. C'est principalement pour pouvoir introduire la synchronisation d'iCloud, puisqu'il y a des problèmes continus avec la synchronisation d'iCloud dans CoreData.Ouvrir UIDocument de façon synchrone

À certains endroits, je peux facilement remplacer l'utilisation de CoreData avec la gestion UIDocument correspondante, à certains endroits, cependant, j'ai vraiment du mal à remplacer le code synchrone par du code asynchrone. Principalement lorsque j'ai besoin d'ouvrir des documents à la volée, pour un accès rapide, par exemple lors d'un calcul.

J'ai déjà mis en œuvre par ex. groupes d'expédition, d'attendre UIDocument opérations, mais dans certains endroits, cela ne semble pas approprié. Par exemple. quand beaucoup de documents doivent être ouverts dans l'ordre pour terminer le calcul, cela se traduirait par un enchaînement très complexe et bizarre de blocs et de groupes de répartition.

Pour mieux comprendre le problème, permettez-moi de décrire à peu près quel est le roi des documents mon application utilise:

  • un document par utilisateur actif (différents utilisateurs peuvent se connecter/déconnecter)
  • un document par utilisateur + par an (application peut afficher une année sélectionnée)
  • documents de données multiples par utilisateur + par an
  • Quelques autres documents de métadonnées qui peuvent tous être chargés que dans la mémoire une fois (pas de problème)

Donc, pour un utilisateur et deux ans d'utilisation de l'application, il peut y avoir environ 50 documents qui doivent être affichés à la demande et utilisés pour le calcul.

Les documents de l'utilisateur seront toujours ouverts et chargés en mémoire, je ne vois pas les problèmes ici. Pour les autres documents, ce n'est pas si simple, car j'ai besoin de les charger à la volée, aussi probablement des documents d'autres utilisateurs qui ne sont pas actuellement actifs (ceci élimine la possibilité de charger tous les documents en mémoire pour l'utilisateur courant).

Donc, ma question principale est, quelle serait une bonne approche dans le traitement de beaucoup de documents? Je parie que c'est une mauvaise idée, de simplement charger tous les documents en mémoire, également en ce qui concerne la synchronisation iCloud. Y a-t-il une API synchrone ou des exemples d'interfaces de synchronisation synchrones/API emboîtables pour UIDocument?

+0

Je n'ai aucune idée si cela aidera mais heres [une autre question] (http://stackoverflow.com/q/10314190/2446155) –

Répondre

1

Vous pouvez ouvrir plusieurs documents de manière synchrone en forçant le thread courant à attendre sur une condition:

- (void)openDocumentsSynchronously:(NSArray *)documents 
{ 
    __block NSUInteger waitingOnDocuments = documents.count; 
    NSCondition *condition = [NSCondition new]; 

    for (UIDocument *document in documents) 
    { 
     [document openWithCompletionHandler:^(BOOL success) { 

      waitingOnDocuments--; 

      [condition lock]; 
      [condition broadcast]; 
      [condition unlock]; 
     }]; 
    } 

    while (waitingOnDocuments > 0) 
    { 
     [condition lock]; 
     [condition wait]; 
     [condition unlock]; 
    } 
} 

Je ne recommanderais pas le faire sur le thread principal, cependant, que les documents pourraient prendre un peu tandis que pour ouvrir.

Questions connexes