Ich verwende eine UIDocument-Unterklasse, die die Möglichkeit hat, ihre saveToURL
-Methode aus mehr als einem Thread aufgerufen. Ich habe eingekapselt es daher in einer Wrapper-Funktion, die ich Thread-sicher machen will:Verwendung von @ synchronized mit synchronen Operationen
- (void)saveWithCompletionBlock:(void(^)(TransactionDocumentReturnCode status))completion {
@synchronized (self) {
[self saveToURL:[self fileURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
// Generate returncode depending on outcome of save operation
completion(returncode);
}];
}
}
Ich gehe davon aus, dass der Anruf zu [self saveToURL:...]
kehrt sofort, da den Speichervorgang selbst auf einem Hintergrund-Thread auftritt, wodurch die Sperre möglicherweise vor dem Abschluss der Sicherungsoperation freigegeben werden. Also, gibt es eine Möglichkeit, andere Threads mit dem Aufruf von saveWithCompletionBlock:
gesperrt zu halten, bis der Completion Block saveToURL
aufgerufen wurde?
Werfen Sie einen Blick auf diese Antwort für zwei Möglichkeiten, dies zu implementieren: http://Stackoverflow.com/a/7649768/78496 – chedabob
Vielen Dank @chedabob. Würde die Verwendung von GCD oder NSOperationQueue dazu führen, dass die nachfolgenden Aufrufe der Sicherungswrapperfunktion blockiert werden, bis der Abschlussblock der Sicherungsoperation beendet wurde? – mashers