【问题标题】:on iOS using Parse, how to save two PFFiles to a PFObject in background在 iOS 上使用 Parse,如何在后台将两个 PFFiles 保存到一个 PFObject
【发布时间】:2013-02-17 14:45:25
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: objective-c-blocks parse-platform


    【解决方案1】:

    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.
    }];
    

    【讨论】:

    • 感谢这个想法。保存最终很好,因为实际上我的应用程序似乎即使在未连接时也可以调用它。目前我只是为两个文件中的每一个做一个“saveInBackground”。这看起来更好,因为在每个文件保存后,我当前正在执行 PFQuery 以获取我想要关联文件并更新它的对象——这样做一次看起来好多了(这意味着我可以不再担心将文件附加到正确的对象!)。谢谢。
    【解决方案2】:

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

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

    Parse's documentation 看来,saveEventually 做了你想做的事:

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

    【讨论】:

    • 这不起作用,你会得到这个错误:Unable to saveEventually a PFObject with a relationship to a new, unsaved PFFile
    【解决方案3】:

    由于目前既不支持 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];
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多