2013-02-17 6 views
5

Meine App erstellt ein Objekt (PFUSER) für jeden Benutzer und ein (PF) -Objekt für jedes Ereignis, an dem sie teilnehmen. Das funktioniert gut. Dann habe ich zwei Dateien mit diesem Ereignis verbunden. Ich speichere die erste Datei in einem PFFile und ordne sie dann dem Ereignis pfobject zu. Wenn ich Blöcke benutze und dies im Hintergrund mache, wie kann ich dann sicherstellen, dass die Kontrolle auch weiterhin für die zweite Datei funktioniert?auf iOS mit Parse, wie zwei PFFiles zu einem PFObject im Hintergrund gespeichert werden

Ich bin neu in Blöcken so vielleicht wäre es mir klarer, warum es nicht mit Callbacks funktioniert, aber es scheint, der Block führt das Speichern in einem anderen Thread und der aktuelle ist aufgegeben, bevor die nächsten Schritte unternommen werden.

Natürlich möchte ich beide als "speichern Sie schließlich", um die Offline-Nutzung zu ermöglichen.

jede Anleitung/Beispiele können Sie mich sehr zu schätzen wissen.

danke!

Antwort

11

saveEventually PFFiles noch nicht unterstützt; Es braucht ein bisschen mehr Intelligenz, um Uploads zwischen Neustarts wieder aufzunehmen. Ein Trick, der bereits verfügbar ist, ist jedoch, dass PFObject weiß, wie man seine Kinder einschließlich PFFiles speichert. Sie können nur sagen:

PFUser *user = PFUser.currentUser; 
user[@"icon"] = [PFFile fileWithData:iconData]; 
user[@"iconThumb"] = [PFFile fileWithData:iconThumbData]; 
[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
    // user will automatically save its files & only call this once the 
    // entire operation succeeds. 
}]; 
+0

Vielen Dank für diese Idee. Sparen war schließlich nett, weil es in der Tat schien, dass meine App das auch anrufen konnte, wenn sie nicht verbunden war. Momentan mache ich nur einen "saveInBackground" für jede der zwei Dateien. Dies sieht besser darin aus, dass ich nach jeder Dateispeicherung gerade eine PFQuery mache, um das Objekt zu erhalten, mit dem ich die Datei assoziiere und aktualisiere - dies zu tun, sieht viel besser aus (und bedeutet, dass ich aufhören kann, mir die Dateien anzuhängen) richtiges Objekt!). Vielen Dank. – hangzhouharry

1

Ich bin nicht 100%, was Sie meinen, weil Sie keine Codes keine Beiträge haben, aber ich kann mir vorstellen, wenn Sie mehrere PFFile PFObject das ist alles, was Sie tun müssen verknüpft werden soll:

PFObject *object = [PFQuery getObjectOfClass:@"MyFile" objectId:id]; 
[object addObject:profilePicture forKey:@"Photo"]; 
[object addObject:coverPicture forKey:@"PhotoCover"]; 
[object saveEventually]; 

Von Parse's documentation es wie saveEventually scheint das tut, was Sie wollen:

Saves this object to the server at some unspecified time in the future, even if Parse is currently inaccessible. Use this when you may not have a solid network connection, and don’t need to know when the save completes. If there is some problem with the object such that it can’t be saved, it will be silently discarded. If the save completes successfully while the object is still in memory, then callback will be called.

+0

das wird nicht funktionieren, werden Sie diese Fehlermeldung erhalten: Kann nicht saveEventually ein PFObject mit Bezug auf einen neuen, nicht gespeicherte PFFile –

1

Wie derzeit weder saveEvetually noch an den lokalen Datenspeicher Speichern unterstützt werden, ist eine Kategorie von PFObject ich zumindest bin mit zu offline speichern, was oder Rückkehr Fehler gespeichert werden können:

- (void) dr_saveWithCompletionHandler: (void(^)(NSError* error)) completionBlock { 

__block BOOL canSaveEventually = YES; 

[[self allKeys] enumerateObjectsUsingBlock:^(NSString* key, NSUInteger idx, BOOL *stop) { 
    id object = self[key]; 

    if ([object isKindOfClass:[PFFile class]]) { 
     PFFile* file = (PFFile*) object; 

     if (!file.url || file.isDirty) { 
      canSaveEventually = NO; 
     } 
    } 
}]; 

void (^localCompletionHandler) (BOOL, NSError*) = ^(BOOL succeeded, NSError *error) { 

    if (succeeded) { 
     if (completionBlock) completionBlock(nil); 

    } else { 
     if (completionBlock) completionBlock(error); 
    } 
}; 

if (canSaveEventually) { 
    [self saveEventually:localCompletionHandler]; 
} else { 
    [self saveInBackgroundWithBlock:localCompletionHandler]; 
} 

}