Сохранить в конечном итоге на PFObject с PFFile (Parse Local Datastore)?

Цель

Я пытаюсь сохранить PFObject, у которого PFFile есть атрибут. Я использую новый Local Datastore для iOS, поэтому я хотел бы сохранить этот PFObject с помощью метода saveEventually().

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что метод saveEventually() не похож на сохранение PFFiles. Я попытался saveEventually() мой объект без привязанного PFFile, и это сработало нормально. Как только мой PFFile был повторно подключен, Xcode бросил пару уведомлений о контрольных точках (ошибки?), Но не прекратил приложение, и кажется, что все прошло хорошо, однако проверка в браузере анализа данных подтвердила, что сохранение не проходить.

До использования функции Local Datastore я не считаю, что это спасение было бы возможным - это вызвало бы ошибку "Unable to saveEventually a PFObject with a relation to a new, unsaved PFFile.". Кажется, что функция Local Datastore исправила это, поскольку она указана в iOS Local Datastore docs:

"Привязка PFObject рекурсивна, как и сохранение, поэтому любые объекты на которые указывает тот, который вы закрепляете, также будут закреплены. Когда объект привязан, каждый раз, когда вы обновляете его, выбирая или сохранение новых данных, копия в локальном хранилище данных будет обновлена автоматически. Вам не нужно об этом беспокоиться.

Я обновил SDK до последней версии (v1.6.2). Есть идеи?

Ответ 1

PFFiles по-прежнему не поддерживают saveEventually здесь

Эта страница была обновлена: 2015-01-23

Вы могли бы pinInBackgroundWithBlock и, если успешно, сохраните PFFile во временную папку в своем приложении и удалите ее при необходимости или без нее

Ответ 2

Я только что выпустил класс, который позволяет экономично сохранять PFFile.

Вы можете найти здесь:

/*
     This example uses an UIImage, but this works with any file writable as NSData
     We begin by writing this image in our tmp directory with an uuid as name.
 */
UIImage *nyancat = [UIImage imageNamed:@"nyancat.jpg"];
NSData *imageData = UIImageJPEGRepresentation(nyancat, 0.5);

NSString *filename = [[NSUUID UUID] UUIDString];
NSURL *fileUrl = [PFFileEventuallySaver fileURLInTmpWithName:filename];

[imageData writeToURL:fileUrl atomically:YES];

 /*
     We create a PFObject (you can pass an array to below function if you need your file to be saved on several objects). If upload works on first time, do what you want with your file, like linking it on your PFobject.

     If saving fails, it'll be retried as soon as network is available, on this session or nexts launches of app.
     In that case, the pointer at key kPFFILE_MANAGER_OBJECT_FILE_KEY of your PFFObject will be set with the PFFile, then saved eventually within PFFileEventuallySaver
 */
PFObject *object = [PFObject objectWithClassName:kPFFILE_CONTAINER_OBJECT_CLASSNAME];

[[PFFileEventuallySaver getInstance] trySaveobjectAtURL:fileUrl associatedObjects:@[object] withBlock:^(PFFile *file, NSError *error) {
if(!error)
{
    NSLog(@"[First try, network is fine] File saved, saving PFObject");

    object[kPFFILE_MANAGER_OBJECT_FILE_KEY] = file;
    [object saveEventually];

    NSLog(@"Try again disabling your network connection");
}
else
{
    NSLog(@"No network, connect back your wifi, or relaunch app. Your file will be sent");
}
} progressBlock:^(int percentDone) {
    NSLog(@"[First try, network is fine] Sending file %d/100%%", percentDone);
}];