2012-04-01 4 views
5

У меня есть основная проблема синхронизации openWithCompletionHandler: (UIManagedDocument) с основными действиями.iOS5.1: синхронизация задач (дождитесь завершения)

Ситуация: У меня есть одноэлементный класс, управляющий общим UIManagedDocument. Этот класс предоставляет один метод, который должен доставлять документ в нормальном состоянии (т. Е. Создает или открывает его, что бы ни было необходимо). Но поскольку openWithCompletionHandler: выполняет свою основную работу асинхронно в фоновом режиме, моя программа должна ждать с настройкой fetchedResultsController, пока документ не будет открыт. Метод «viewWillAppear» (в настоящее время) не дает полезного вывода, когда база данных не готова. Ожидание было бы в порядке для меня, но получение уведомлений, вероятно, было бы лучшим способом. Возможно, viewWillAppear оказывается не правильным для setupFetchedResultsController, потому что не вызван в runloop.

Есть ли стандартный шаблон для достижения этого?

Бит больше фона (не так важно, я полагаю) Я работаю над небольшим приложением iOS 5.1 с использованием CoreIata UIManagedDocument. Я походил на пример из урока 14 из курса Стэнфорда прошлой осени в iTunes-U. Все работало нормально, пока я не попытался передать обработку UIManagedDocument из класса UITableViewController в отдельный класс, обрабатывающий мой документ. В исходной версии FetchedResultsController был настроен в обработчике завершения.

ответ

3

Я предлагаю отличное сообщение Justin Driscoll на Core Data with a Single Shared UIManagedDocument.

Вы найдете полную запись на синглтоне UIManagedDocument и пример на performWithDocument. Ваш установочный код fetchedResultsController должен действительно находиться в файле executeWithDocument:^{}.

Также обратите внимание, что openWithCompletionHandler не является потокобезопасным - одновременные вызовы performWithDocument при открытии документа могут привести к сбою. Решение для меня было нетривиальным (и довольно специфичным для приложения), поэтому, если вы столкнулись с той же проблемой, я предлагаю вам посмотреть на UIDocumentStateChangedNotification, который уведомляет изменения состояния документа и может быть вашей точкой синхронизации для нескольких открывателей документов.

Некоторые сниппет, если вы заинтересованы,

Первый в инициализации MYDocumentHandler, в установку дополнительного уведомления в конце:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(documentStateDidChange:) 
               name:UIDocumentStateChangedNotification 
               object:self.document]; 

Тогда в performWithDocument, @synchronized (self.document) на критической открытым/creation, чтобы обеспечить только один поток, и блокировать дальнейшие потоки до тех пор, пока не будет выполнено открытие/создание.

Наконец, добавьте следующую функцию:

- (void)documentStateDidChange:(NSNotification *)notification 
{ 
    if (self.document.documentState == UIDocumentStateNormal) 
     @synchronized (self.document) { 
      ... unblock other document openers ... 
     } 
} 

Что касается блока/разблокирования потоков, YMMV. Я использовал dispatch_semaphore_t вместе с некоторыми dispatch_queues для удовлетворения требований, специфичных для приложения. Ваш случай может быть таким же простым, как ожидание завершения или отбрасывание других потоков.

Смежные вопросы