撤消/恢复对 PFObject 的本地更改

Posted

技术标签:

【中文标题】撤消/恢复对 PFObject 的本地更改【英文标题】:Undo/revert local changes to PFObject 【发布时间】:2014-10-26 19:02:45 【问题描述】:

假设我有一个正在编辑的 PFObject。在稍后阶段,我希望取消对 PFObject 所做的更改。如何恢复到 PFObject 的原始副本?

我尝试过的

    if (self.request.isDirty)    // self.request is a PFObject
        // Reload object
        NSLog(@"%@", self.request.requestTitle); // Logs ABC, Original was DEF
        [self.request refreshInBackgroundWithBlock:^(PFObject *object, NSError *error) 
            if (!error) 
                NSLog(@"%@", self.request.requestTitle);   // Logs ABC
                [self.requestDetailsTableView reloadData];
            
        ];
    

我也尝试获取对象,但结果相同

    if (self.request.isDirty)    // self.request is a PFObject
        // Reload object
        NSLog(@"%@", self.request.requestTitle); // Logs ABC, Original was DEF
        [self.request fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) 
            if (!error) 
                NSLog(@"%@", self.request.requestTitle);   // Logs ABC
                [self.requestDetailsTableView reloadData];
            
        ];
    

【问题讨论】:

你有没有保存过PFObject? 不。我没有。已检查数据库以确保。我相信如果数据可用,它会从缓存中获取它(我认为 fetchIfNeeded likes 应该是这种情况) 也许首先尝试使用clearCachedResult清除该PFObject的PFQuery缓存结果:parse.com/docs/ios/api/Classes/PFQuery.html#//api/name/… 您在获取之前尝试过self.request = [PFObject objectWithoutDataWithObjectId:self.request.objectId] 之类的方法吗?也许这会有所帮助。 【参考方案1】:

PFObject 现在有一个 revert 方法,只要您没有调用 save,它就会将您的对象重置回服务器状态:http://parseplatform.org/Parse-SDK-iOS-OSX/api/Classes/PFObject.html#/c:objc(cs)PFObject(im)revert

例如,我使用带有表单的推送视图控制器来编辑我的 PFObject 子类的属性,并且我有两个按钮用于取消和保存...

@IBAction override func cancelAction() 
    self.myObject?.revert()
    self.navigationController?.popViewControllerAnimated(true)


@IBAction override func saveAction() 
    self.myObject?.saveInBackgroundWithBlock( (succeeded: Bool, error: NSError?) -> Void in
        if (succeeded) 
            self.navigationController?.popViewControllerAnimated(true)
         else 
            // Show error
        
    )

【讨论】:

【参考方案2】:

目前没有办法直接做到这一点 - 你需要在你的呼叫中做一些花哨的步法:)

试试这个:

if (self.request.isDirty)    // self.request is a PFObject
    // Reload object
    NSLog(@"%@", self.request.requestTitle); // Logs ABC, Original was DEF
    PFQuery *newRequest = [PFQuery queryWithClassName:@"YourClassName"];
    //Add your request parameters here...

    [newRequest getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) 
        if (!error) 
            self.request = object;
            NSLog(@"%@", self.request.requestTitle);   // Should log DEF
            [self.requestDetailsTableView reloadData];
        
    ];

【讨论】:

我确实以奇特的方式做事。但是想发布这个问题,希望一些 Parse 开发人员会绊倒它并做一些事情。谢谢:)

以上是关于撤消/恢复对 PFObject 的本地更改的主要内容,如果未能解决你的问题,请参考以下文章

在 TFS 2013 中启动回滚后,我可以恢复我最近的本地更改吗?

powershell Git撤消上次提交并保持本地更改

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

如何撤消添加版本应用程序而不还原

撤消对 SQL Server 2005 数据库的更改

PFObject 上传标志