最终使用 PFFile(解析本地数据存储)保存在 PFObject 上?

Posted

技术标签:

【中文标题】最终使用 PFFile(解析本地数据存储)保存在 PFObject 上?【英文标题】:Save eventually on PFObject with PFFile (Parse Local Datastore)? 【发布时间】:2015-03-23 19:36:38 【问题描述】:

目标

我正在尝试保存具有PFFile 属性的PFObject。我正在为 ios 使用新的 Local Datastore,所以我想用 saveEventually() 方法保存这个 PFObject

问题

我遇到的问题是saveEventually() 方法似乎不喜欢保存PFFiles。我尝试saveEventually() 我的对象没有附加任何PFFile,效果很好。重新连接我的PFFile 后,Xcode 抛出了几个断点通知(错误?),但没有终止应用程序,看起来一切顺利 - 但是检查 Parse Data Browser 确认保存确实不通过。 在本地数据存储功能之前,我不相信这种保存是可能的 - 它会引发 "Unable to saveEventually a PFObject with a relation to a new, unsaved PFFile." 错误。正如iOS Local Datastore docs 中所述,本地数据存储功能似乎已解决此问题:

"固定一个 PFObject 是递归的,就像保存一样,所以任何对象 您正在固定的那个指向的也将被固定。 当一个对象被固定时,每次你通过获取或更新它时 保存新数据,本地数据存储中的副本将被更新 自动地。你完全不用担心。”

我已将 SDK 更新到最新版本 (v1.6.2)。有任何想法吗?

【问题讨论】:

【参考方案1】:

我刚刚发布了一个允许最终保存一个 PFFile 的类。

你可以找到它here:

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

【讨论】:

我不得不对其进行大量修改以使其在我的项目中工作,但它让我走上了正轨。非常感谢。【参考方案2】:

PFFiles 仍然不支持 saveEventually see here

该页面最后更新时间:2015-01-23

您可以pinInBackgroundWithBlock,如果成功将 PFFile 保存到您的应用程序包中的临时文件夹,并在必要时将其删除或取消固定

【讨论】:

开枪!但是,您的回答使我发现了解决方法:首先pin 对象,然后saveEventually 对象!我不能给你最好的答案,因为我想出的答案更简单并且保留在 Parse SDK 中,但你绝对值得一票;)! 我说得太早了。该对象出现在数据浏览器中,这让我很兴奋,但后来我意识到 PFFile 没有保存。我将尝试用saveInBackground() 替换saveEventually() @dcgoss “留在 Parse SDK 中”既不好也不坏,就是这样。您必须意识到将其保存到临时文件夹的任何一种方式,或者如果您使用 Parse,它们都会存储在设备上。使用 Parse 会更容易,并且将其保持在相同的环境中可以降低出错的风险,但是,不能保证 saveEventually 会在应用程序打开后立即被调用,它在被调用时也不受您的控制。所以 saveInBackground 可能是最好的选择,因为它在那个时间点得到保证,并且工作,加上与可达性的交叉引用限制了潜在的故障。 我只是说尝试使用 Parse 比破解我自己的解决方案更容易,我想知道 save 是否最终随着数据存储的引入而工作。但你完全正确。我意识到,在我的情况下,不知道存档何时进行并不是一个好主意。 一个较新的问题有一个类似于你的答案,它向 PFObject 添加了一个文件路径:***.com/questions/28136175/…

以上是关于最终使用 PFFile(解析本地数据存储)保存在 PFObject 上?的主要内容,如果未能解决你的问题,请参考以下文章

没有 PFObject 的 PFFile - 解析

如何在目标 c 中将 PFFILE 设置为本地 UIImage

PFFile 保存在哪里?

PFFile 无法将文件存储到 Parse-server

离线 Parse.com 时如何在 localdatastore 中保存图像 PFFile?

AWS ElasticBeanStalk 上的解析服务器不会将 .mp4 PFFile 流式传输到 AVPlayer?