3

次のコードでは、完了ハンドラは実行されません。私が見つけることができた 1 つの説明は、UIManagedDocument を使用した Xcode 4.5 を使用した iPhone Simulator 5.1 のこの Bug です。iPhone シミュレーター 5.1 のバグである可能性があると書かれています。ただし、iPhone シミュレーター 6.0、6.1、および 7.0 を試しましたが、どれも機能しませんでした。よろしくお願いします。

(ちなみに、このコードはスタンフォード iOS コースの講義 14 で見たことがあります)

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"DataDocument"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];

if(![[NSFileManager defaultManager] fileExistsAtPath:[url path]]){

        NSLog(@"This logs");

    [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){

        NSLog(@"This never logs");

    }];

}else if(document.documentState == UIDocumentStateClosed){

        NSLog(@"This logs");
    [document openWithCompletionHandler:^(BOOL success){
        NSLog(@"This never logs");
    }];

}else{
    //I have a separate log for this, but it's never 'else'
}

編集:まったく同じ問題を扱っていると思われる質問を見つけました。nsmanageobjectcontextを取得できません 実行されていない完了ハンドラにピン留めしました。

編集: 問題が何であるかがわかりました。実行ループを使用すると、問題が解決しました。以下の例。

if(doc.documentState == UIDocumentStateClosed){

    NSLog(@"This logs");
    __block BOOL waitingOnCompletionHandler = YES;
    [doc openWithCompletionHandler:^(BOOL success){

        NSLog(@"This logs too!");

    }];

    while (waitingOnCompletionHandler) {
       NSDate *futureTime = [NSDate dateWithTimeIntervalSinceNow:0.1];
       [[NSRunLoop currentRunLoop] runUntilDate:futureTime];
    }

}
4

0 に答える 0