PFObject は、ネットワークに到達可能な場合に Parse で同期するために saveEventually にすることができますが、その間はローカルに保持されます。
ファイルに PFFile が含まれている場合、PFObject を保存する前にファイルを saveInBackground にする必要があります。
ネットワークが到達可能になったときに送信するために、PFFile を最終的に保存する方法は?
PFObject は、ネットワークに到達可能な場合に Parse で同期するために saveEventually にすることができますが、その間はローカルに保持されます。
ファイルに PFFile が含まれている場合、PFObject を保存する前にファイルを saveInBackground にする必要があります。
ネットワークが到達可能になったときに送信するために、PFFile を最終的に保存する方法は?
ご存じかもしれませんが、その機能は ParseSDK 内では利用できないため、これを回避する方法を漠然と説明している投稿をいくつか見た後、XCode プロジェクトで動作するサンプルを作成しました。
これは、保存された PFFile を関連付けるために単一の Parse クラスに対してのみ機能するなどの制限がある、機能する PoC にすぎません。
Reachability pod '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);
}];
これは大幅に改善される可能性がありますが、同様の実用的な例を見つけたいと思っていたので、皆さんはそれが役立つと思うかもしれません.