Program obsługi iOS 7 nigdy nie zostanie wywołany

W poniższym kodzie żaden z modułów obsługi zakończeń nigdy nie został wykonany. Jedynym wyjaśnieniem, jakie udało mi się znaleźć, jest toBłąd w iPhone Simulator 5.1 z Xcode 4.5 za pomocą UIManagedDocument . Mówi, że może to być błąd w symulatorze iPhone 5.1. Jednak wypróbowałem symulatory iPhone 6.0, 6.1 i 7.0, żaden z nich nie działał. Naprawdę doceniam twoją pomoc.

(Przy okazji, widziałem ten kod na kursie Stanford iOS, wykład 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'
}

EDYCJA: Znalazłem pytanie, które wydaje się dotyczyć dokładnie tego samego problemu.Nie mogę uzyskać kontekstu nsmanageobject Właśnie przypiąłem go do nieukończonego programu obsługi zakończenia.

EDYTOWANIE: Odkryłem, na czym polega problem: ponieważ openWithCompletionHandler wykonuje asynchronicznie, moja aplikacja spróbuje użyć dokumentu, zanim zakończy się otwarcie. Użycie pętli uruchomieniowej rozwiązało problem. Przykład poniżej.

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];
    }

}

questionAnswers(0)

yourAnswerToTheQuestion