5

我的应用程序为每个用户创建一个对象 (PFUSER),并为他们参与的每个事件创建一个 (PF) 对象。这很好用。然后我有两个与该事件关联的文件。我将第一个文件保存到 PFFile,然后将其关联到事件 pfobject。当我使用块并在后台执行此操作时,如何确保控制继续对第二个文件执行相同操作?

我是块的新手,所以也许我会更清楚为什么它不使用回调,但似乎块在另一个线程中运行保存,并且在采取下一步之前放弃当前的。

当然,我想将这两项都作为“最终保存”以允许离线使用。

任何指导/示例,您都可以指出我非常感谢。

谢谢!

4

3 回答 3

11

saveEventually 还不支持 PFFiles;它需要更多的智慧来处理重新启动之间的恢复上传。然而,一个已经可用的技巧是 PFObject 知道如何保存它的孩子,包括 PFFiles。你可以说:

PFUser *user = PFUser.currentUser;
user[@"icon"] = [PFFile fileWithData:iconData];
user[@"iconThumb"] = [PFFile fileWithData:iconThumbData];
[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    // user will automatically save its files & only call this once the
    // entire operation succeeds.
}];
于 2013-02-19T19:44:13.347 回答
1

我不是 100% 你的意思,因为你没有发布任何代码,但我想如果你想将多个 PFFile 关联到 PFObject 这就是你所要做的:

PFObject *object = [PFQuery getObjectOfClass:@"MyFile" objectId:id];
[object addObject:profilePicture forKey:@"Photo"];
[object addObject:coverPicture forKey:@"PhotoCover"];
[object saveEventually];

Parse 的文档看来saveEventually,你想要什么:

在未来某个未指定的时间将此对象保存到服务器,即使 Parse 当前不可访问。当您可能没有可靠的网络连接并且不需要知道保存何时完成时,请使用此选项。如果对象存在无法保存的问题,它将被静默丢弃。如果在对象仍在内存中时保存成功完成,则将调用回调。

于 2013-02-18T03:18:30.887 回答
1

由于目前既不支持 saveEvetually 也不支持保存到本地数据存储,下面是我用来至少离线保存可以保存或返回错误的 PFObject 类别:

    - (void) dr_saveWithCompletionHandler: (void(^)(NSError* error)) completionBlock {

__block BOOL canSaveEventually = YES;

[[self allKeys] enumerateObjectsUsingBlock:^(NSString* key, NSUInteger idx, BOOL *stop) {
    id object = self[key];

    if ([object isKindOfClass:[PFFile class]]) {
        PFFile* file = (PFFile*) object;

        if (!file.url || file.isDirty) {
            canSaveEventually = NO;
        }
    }
}];

void (^localCompletionHandler) (BOOL, NSError*) = ^(BOOL succeeded, NSError *error) {

    if (succeeded) {
        if (completionBlock) completionBlock(nil);

    } else {
        if (completionBlock) completionBlock(error);
    }
};

if (canSaveEventually) {
    [self saveEventually:localCompletionHandler];
} else {
    [self saveInBackgroundWithBlock:localCompletionHandler];
}

}

于 2015-01-28T16:25:09.803 回答