Ich richte NSFileCoordinator
und NSFilePresenter
in meiner App ein, damit ich Datei IO von meiner AppleWatch App sicher machen kann. Es gibt einige Stellen in meinem Code, wo ich in schneller Folge mehrere Male in eine Datei schreibe. Dies ist ein Problem an sich und ich arbeite daran, es zu korrigieren, aber ich bemerke ein seltsames Verhalten in diesem Prozess.Lange Verzögerung mit NSFileCoordinator cordinateWritingItemAtURL
ich meine schreibt wie diese wickeln:
//In a class that implements NSFilePresenter:
NSFileCoordinator *coord = [[NSFileCoordinator alloc]initWithFilePresenter:self];
[coord coordinateWritingItemAtURL:self.presentedItemUrl options:0 error:nil byAccessor:^(NSURL *url)
{
//do my writing here using CFWriteStreamRef or NSOutputStream
}];
Auf der ersten Schreib der Schreibblock geschieht innerhalb von 1 ms. Aber danach gibt es etwa eine Verzögerung von 0,5 Sekunden zwischen dem Aufruf von coordinateWritingItemAtURL
und dem Ausführen des Schreibblocks.
Ist das erwartete Verhalten?
Some of the documentation für NSFileCoordinator
und NSFilePresenter
sagt prepareForReadingItemsAtURLs:writingItemsAtURLs:options:error:byAccessor:
für Batch-Operationen zu verwenden, aber es scheint seltsam, eine solche lange Verzögerung zu erhalten, wenn ich nicht Batch tun.
Aktualisierung: Das passiert beim Lesen auch.
Update 2:Here ist ein Beispielprojekt, das das Problem reproduziert.
Update 3: Mit dieser API für die Koordination zwischen einer Anwendung und ihrer Verlängerung ist ein apparentlybadidea. Aber die Frage steht immer noch.
Wo rufst du cordinateWriting ... ab? Die watch Extension, die Eltern-App über openParentApplication, woanders ...? –
@MattG in der übergeordneten Anwendung. –
Übergeben Sie ein gültiges NSError-Objekt in das Fehlerfeld, um festzustellen, ob beim ersten Schreibvorgang ein Fehler auftritt (vielleicht kommt es deshalb sofort zurück). Abgesehen davon werden Blöcke normalerweise nicht sofort ausgeführt, ihr Verhalten ist asynchron und kann zu einem späteren Zeitpunkt in der Ausführungsschleife ausgeführt werden. – resurrecteds