2015-04-16 7 views
9

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.

+0

Wo rufst du cordinateWriting ... ab? Die watch Extension, die Eltern-App über openParentApplication, woanders ...? –

+0

@MattG in der übergeordneten Anwendung. –

+0

Ü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

Antwort

4

Mit Bezug auf File System Programming Guide, können Sie folgendes lesen:

Sie könnten Änderungen vermeiden möchten Methode direkt aus der Datei Moderator enthält. Senden Sie stattdessen einen Block asynchron an eine Dispatch-Warteschlange und bearbeiten Sie die Änderungen zu einem späteren Zeitpunkt. So können Sie die Änderungen an der Bequemlichkeit Ihrer App verarbeiten, ohne unnötige Verzögerungen zu dem Dateikoordinator zu verursachen, der die Änderung initiierte. Natürlich, wenn (wie in der relinquishPresentedItemToReader:, relinquishPresentedItemToWriter: oder savePresentedItemChangesWithCompletionHandler: Methoden) Speichern oder Steuerung einer Datei zu verzichten, sollten Sie alle notwendigen Aktionen durchführen sofort und nicht verschiebe sie.

Ich denke, dies der Fall ist, wo Sie defering Aktionen.

Mögliche Lösung:

Bitte lesen this gut, richtig zu mehreren aufeinanderfolgenden Schreiboperationen, die relinquishPresentedItemToWriter, kann die Arbeit erledigen zu behandeln, gleiche wird mit dem Lesen-Datei arbeiten, relinquishPresentedItemToReader, angenommen dass mehrere verschiedene Objekte versuchen, dieselbe Datei zu lesen und zu schreiben.

PS:

Ich weiß nicht, was Ihre Anwendung genau funktioniert, aber ich hoffe, dass Sie diese gelesen haben:

Wenn Sie ein Dokument-basierte Anwendung implementieren, brauchen Sie nicht zu Integrieren Sie die Semantik des Datei-Presenters in Ihre NSDocument-Unterklassen. Die NSDocument-Klasse entspricht bereits dem NSFilePresenter-Protokoll und implementiert die entsprechenden Methoden. So registrieren sich alle Ihre Dokumente automatisch als Moderatoren ihrer entsprechenden Datei und tun Dinge wie Änderungen speichern und Änderungen an der Dokument verfolgen.

+0

Ich verwende kein NSDocument. Die IO-Arbeit, die von den 'Koordinate ...' Methoden 'CFReadStreamRef' und' CFWriteStreamRef' umschlossen wird. Und ich mache nichts teures, wenn ich anderen Lesern/Autoren gebe. Die Verzögerung scheint darauf verwandt zu werden, die Sperren, die zur Koordinierung der Prozesse verwendet werden, zu erhalten. –

+0

Siehe mein Update ein Beispielprojekt hinzufügen. –

+0

@ Mr. Jefferson gibt es andere Objekte, die versuchen, mit Ihrer Datei umzugehen, während Sie darauf schreiben? – ProllyGeek