Сохранение PFFile в конце концов

PFObject может быть saveEventually для синхронизации на Parse, когда сеть доступна, сохраняя при этом его локально.

Если ваш файл содержит PFFile, файл должен быть сохранен в фоновом режиме, прежде чем ваш PFObject можно будет сохранить.

Как сохранить в конечном итоге файл PFF, чтобы его можно было отправить сейчас или позже, когда сеть будет доступна?


person Thibaud David    schedule 10.09.2015    source источник


Ответы (1)


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

Это только работающий PoC с ограничениями, такими как работа только для одного класса Parse, с которым можно связать сохраненный PFFile.

Требуется модуль Reachability «Доступность», «~> 3.2».

Как это использовать ? Ну, я думаю, примеры проектов хорошо описывают это, но вот фрагмент кода, чтобы понять, как это работает:

(Не забудьте запустить pod install для разрешения зависимостей перед запуском примера)

/*
 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);
}];

Это можно было бы значительно улучшить, но я подумал, что вы, ребята, можете найти это полезным, так как я хотел бы найти аналогичный рабочий пример.

person Thibaud David    schedule 10.09.2015