Używam implementacji Justina Driscolla na Core Data with a Single Shared UIManagedDocument. Wszystko było dobrze w mojej aplikacji na iPhone'a, dopóki nie przeniosłem go do storyboardu na iPada i kontrolera splitview dla aplikacji ipad. Problem polega na tym, że openwithCompletionHandler jest wywoływany dwa razy, jeden raz z mojego widoku głównego w viewDidLoad i ponownie w widoku szczegółów viewWillLoad. Połączenia są wykonywane w krótkich odstępach czasu, a ponieważ dokument jest nadal w UIDocumentStateClosed, gdy drugie wywołanie zostanie wykonane do mojej metody performWithDocument (poniżej) singleton aplikacja ulega awarii. Spojrzałem na odpowiedź e_x_p dla posta iOS5.1: synchronising tasks (wait for a completion), ale @sychronized nie zadziała w tym przypadku, ponieważ performWithDokument poniżej jest wywoływany w tym samym wątku. W jaki sposób miałbym chronić przed wieloma wywołaniami do openwithCompletionHandler? Jedynym sposobem, jaki mogę ochronić przed tym, jest wstrzymanie wykonywania jednego z powyższych połączeń, dopóki nie upewnię się, że UIDocumentStateNormal jest prawdziwe, a następnie zostanie zwolnione. To jednak zamroziłoby główny wątek UI, który nie jest dobry. Co jednak byłoby najlepszym sposobem na to, bez zamrożenia interfejsu użytkownika?UIManagedDocument Singleton Code openWithCompletionHandler zadzwonił dwukrotnie i zawiesił się
z kodu UIManagedDocumentSingleton:
- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
{
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
{
//This should never happen*******************
[self.document saveToURL:self.document.fileURL
forSaveOperation:UIDocumentSaveForCreating
completionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateClosed) {
[self.document openWithCompletionHandler:OnDocumentDidLoad];
} else if (self.document.documentState == UIDocumentStateNormal) {
OnDocumentDidLoad(YES);
}
}
Mam skonsolidowane wniosek pobierał do jednego pierwszego połączenia, które cellForRowAtIndexPath i numberOfRowsInSection teraz wykorzystać w ten sposób nie mają tam problem już jednak problem nadal istnieje. Zaktualizowałem ten problem, aby go uprościć. –
Czy mógłbyś 'zsynchronizować (documentObject)', aby zsynchronizować się z samym obiektem? Blokowanie w taki sposób, że możesz delegować uprawnienia od głównego/szczegółu, tak aby tylko jeden z nich musiał wykonać połączenie (lub jeśli mają zagwarantowaną kolejność wykonywania, możesz przekazać wiadomość między nimi (najprawdopodobniej przez '@ protokół'). Wykonaj na drugim, gdy pierwszy zostanie zrobiony –