2013-02-17 6 views
5

La mia app crea un oggetto (PFUSER) per ogni utente e un oggetto (PF) per ogni evento a cui partecipano. Funziona perfettamente. quindi ho due file associati a quell'evento. salvataggio il primo file in un PFFile, quindi lo associo all'evento pfobject. quando uso i blocchi e lo faccio in background, come posso assicurarmi che il controllo continui a fare lo stesso per il secondo file?su iOS con Parse, come salvare due PFFiles su un PFObject in background

Sono nuovo ai blocchi, quindi forse sarebbe più chiaro per me perché non funziona con i callback, ma sembra che il blocco esegua il salvataggio in un altro thread e quello corrente venga abbandonato prima che vengano presi i passaggi successivi.

Ovviamente mi piacerebbe fare entrambe le cose come "salva alla fine" per consentire l'utilizzo offline.

eventuali indicazioni/esempi che puoi indicarmi molto apprezzato.

grazie!

risposta

11

saveEventually non supporta ancora i PFFiles; ha bisogno di un po 'più di intelligenza per gestire la ripresa dei caricamenti tra riavvii. Un trucco che è già disponibile, tuttavia, è che PFObject sa come salvare i suoi figli, inclusi i PFFiles. Si può solo dire:

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

Grazie per questa idea. Salvare alla fine è stato bello perché in effetti sembrava che la mia app potesse chiamarlo anche se non connesso. Attualmente sto solo facendo un "saveInBackground" per ciascuno dei due file. Ciò sembra migliore in quanto dopo ogni salvataggio di file attualmente sto facendo un PFQuery per ottenere l'oggetto con cui voglio associare il file e aggiornarlo - facendo questo una volta sembra molto meglio (e significa che posso smettere di preoccuparmi di allegare i file al oggetto corretto!). Grazie. – hangzhouharry

1

io non sono al 100% quello che vuoi dire perché non hai postare tutti i codici, ma mi immagino se si vuole associare più PFFile a PFObject questo è tutto quello che dovete fare:

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

Da Parse's documentation sembra saveEventually fa ciò che si vuole:

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

questo non funzionerà, si ottiene questo errore: Impossibile saveEventually un PFObject con una relazione ad un nuovo, non salvati PFFile –

1

Come attualmente né saveEvetually né il salvataggio all'archivio dati locali sono supportati, qui di seguito è una categoria di PFObject che sto usando per salvare almeno in linea il salvabile o errore di ritorno:

- (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]; 
} 

}

Problemi correlati