iOS 7 Completion Handler wird nie aufgerufen

Im folgenden Code wird keiner der Completion-Handler ausgeführt. Die einzige Erklärung, die ich finden konnte, ist dieseFehler in iPhone Simulator 5.1 mit Xcode 4.5 unter Verwendung von UIManagedDocument . Es wird darauf hingewiesen, dass es sich möglicherweise um einen Fehler in iPhone Simulator 5.1 handelt. Ich habe jedoch die iPhone-Simulatoren 6.0, 6.1 und 7.0 ausprobiert, keiner von ihnen hat funktioniert. Ich werde Ihre Hilfe wirklich zu schätzen wissen.

(Übrigens habe ich diesen Code im Stanford iOS-Kurs, Vorlesung 14, gesehen.)

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'
}

EDIT: Ich habe eine Frage gefunden, die genau das gleiche Problem zu behandeln scheint.Ich kann keinen nsmanageobject-Kontext abrufen Ich habe es nur so fixiert, dass der Completion-Handler nicht ausgeführt wird.

BEARBEITEN: Ich habe herausgefunden, wo das Problem liegt: Da openWithCompletionHandler asynchron ausgeführt wird, hat meine App versucht, das Dokument zu verwenden, bevor es vollständig geöffnet wurde. Die Verwendung einer Run-Schleife löste das Problem. Beispiel unten.

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

}

Antworten auf die Frage(0)

Ihre Antwort auf die Frage