0

当网络可达时,PFObject 可以最终保存以在 Parse 上同步,同时将其保持在本地。

如果您的文件包含 PFFile,则必须先 saveInBackground 文件才能保存您的 PFObject。

如何最终保存一个 PFFile,以便现在发送,或者稍后在网络可达时发送?

4

1 回答 1

0

您可能知道,ParseSDK 中没有该功能,因此在看到一些模糊解释如何绕过此功能的帖子后,我编写了一个示例工作 XCode 项目

这只是一个有效的 PoC,有一些限制,例如只为单个 Parse 类工作以关联保存的 PFFile。

它需要 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);
}];

这可以大大改进,但我认为你们可能会发现这很有用,因为我想找到一个类似的工作示例。

于 2015-09-10T09:07:33.237 回答