私はCore Data with a Single Shared UIManagedDocumentにJustin Driscollの実装を使用しています。 iPadのストーリーボードとipadアプリのsplitviewコントローラーに移動するまでは、すべて私のiPhoneアプリでうまくいきました。問題はopenwithCompletionHandlerがviewDidLoadのマスタービューから2回、詳細ビューviewWillLoadで2回呼び出されていることです。呼び出しはすぐに連続しています。また、ドキュメントがUIDocumentStateClosedにあるため、シングルトンのperformWithDocumentメソッド(2番目の呼び出し)が呼び出されると、アプリケーションがクラッシュします。投稿iOS5.1: synchronising tasks (wait for a completion)のe_x_pの答えを見ましたが、performWithDocumentが同じスレッド上で呼び出されているので、この場合は@sychronizedは動作しません。 openwithCompletionHandlerへの複数回の呼び出しを防ぐにはどうすればよいですか?私がこれを防ぐために考えることができる唯一の方法は、UIDocumentStateNormalがtrueであることを確認してから解放するまで、上記の呼び出しの実行を一時停止することです。しかし、それは良いではないメインのUIスレッドをフリーズします。 UIをフリーズすることなくこれをやりなおす最善の方法はありますか?UIManagedDocumentシングルトンコードopenWithCompletionHandlerが2回呼び出されてクラッシュする
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);
}
}
私はcellForRowAtIndexPathとnumberOfRowsInSectionは今ので、使用単一最初のコールにフェッチ要求を集約しているもうそこに問題はありませんが、問題はまだ存在する。私はそれを簡素化するために問題を更新しました。 –
あなたは '@synchronized(documentObject)'を使ってオブジェクト自体を同期させることができますか?それは、マスター/ディテールから権威を委譲して、そのうちの1人だけが呼び出しを行う必要がある(または、実行順序が保証されていれば、それらの間で( '@ protocol'を介して)メッセージを渡すことができます –