iCloud:Rückruf für NSFileManagers startDownloadingUbiquitousItemAtURL?
-
12-12-2019 - |
Frage
ich benutze NSFileManager
'S startDownloadingUbiquitousItemAtURL
um die Datei von iCloud auf eine lokale Kopie herunterzuladen (in diesem Fall verfügt die lokale Datei noch nicht über die Kopie der Datei).Ich kann den Rückruf für diesen Prozess anscheinend nicht finden.Ich benötige den Rückruf, um meiner App mitzuteilen, dass die angeforderte Datei vollständig heruntergeladen wurde (in die lokale Kopie), damit eine andere Aufgabe mit dem Lesen des Inhalts der Datei beginnen und andere Aufgaben ausführen kann.
Ich kann überprüfen, ob die Datei heruntergeladen wurde.Aber es würde bedeuten, ständig Umfragen durchzuführen.Gibt es eine Möglichkeit, dies zu tun, ohne einen Timer für die Abfrage festzulegen?
Lösung
Ich glaube, dass diese Methode in Verbindung mit Dateikoordinatoren basierend auf verwendet werden soll Dokumentation von Apple.Sie müssten also einen Dateikoordinator wie diesen verwenden:
NSURL *itemURL = nil; // this is the URL you want to read from
__block NSData *data = nil;
NSError *error = nil;
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[coordinator coordinateReadingItemAtURL:itemURL options:0 error:&error byAccessor:^(NSURL *newURL) {
data = [NSData dataWithContentsOfURL:newURL];
}];
Dies wird jedoch synchron sein. Wenn Sie also etwas asynchron tun möchten, können Sie Blöcke wie folgt verwenden:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// read info from the URL using the code above
dispatch_async(dispatch_get_main_queue(), ^{
// handle data read from the URL
});
});
Andere Tipps
Um korrekt in iCloud hochzuladen, benötigen Sie auch so etwas (alles andere hat nicht funktioniert :| )
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSString *FileNS = @"myfile.dat";
NSURL *FileURL = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:FileNS ];
BYTE *data = NULL;//Put your file data in here
int FileSize = 0;//replace with your file size
NSData *myData = [[NSData alloc] initWithBytes:data length:FileSize];
[myData writeToFile:[FileURL path] atomically:YES];