Я предлагаю следовать Отличному сообщению Джастина Дрисколла о Базовых данных с одним общим UIManagedDocument .
. Вы найдете полную запись в синглтоне UIManagedDocument ипример по executeWithDocument.Ваш установочный код fetchedResultsController должен действительно находиться в блоке executeWithDocument: ^ {}.
Также обратите внимание, что openWithCompletionHandler не является потокобезопасным - одновременные вызовы executeWithDocument при открытии документа вызывают сбой.Для меня решение было нетривиальным (и довольно специфичным для приложения), поэтому, если вы столкнетесь с той же проблемой, я предлагаю вам изучить UIDocumentStateChangedNotification , который уведомляет об изменениях состояния документа и может быть точкой синхронизации для нескольких пользователей.средства для открытия документов.
Небольшой фрагмент, если вам интересно,
Сначала в инициализации MYDocumentHandler, установите дополнительное уведомление в конце:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(documentStateDidChange:)
name:UIDocumentStateChangedNotification
object:self.document];
Затем в executeWithDocument, @synchronized(self.document) в критических разделах открытия / создания, чтобы убедиться, что только один поток заходит одновременно, и блокировать дальнейшие потоки до тех пор, пока открытие / создание завершится успешно.
Наконец добавьте следующую функцию:
- (void)documentStateDidChange:(NSNotification *)notification
{
if (self.document.documentState == UIDocumentStateNormal)
@synchronized (self.document) {
... unblock other document openers ...
}
}
Что касается блоковых / разблокирующих потоков, YMMV.Я использовал dispatch_semaphore_t вместе с некоторыми dispatch_queues, чтобы удовлетворить специфичные для приложения требования.Ваш случай может быть таким же простым, как ожидание завершения или отбрасывание других потоков.