Parse,MagicalRecord和CoreData使用异步操作保存和更新

时间:2014-04-23 17:07:24

标签: ios core-data parse-platform

我遇到MagicalRecordParse的问题。

我有一个存储聊天消息的模型。当用户添加消息时,它会持久保存到存储,然后上传到Parse,然后使用parse objectId进行更新。

这是我的代码:

// create message
__block ChatMessageModel *newMessage = nil;

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    // depending on message type - create message with text or image
    // here is just [ChatMessageModel MR_createInContext:localContext] and setting values
    if (text) {
        newMessage = [ChatMessageModel createWithText:text andAuthor:author onDate:messageDate inChat:[self.chatModel MR_inContext:localContext] inContext:localContext];
    } else if(imageData) {
        newMessage = [ChatMessageModel createWithData:imageData andAuthor:author onDate:messageDate inChat:[self.chatModel MR_inContext:localContext] inContext:localContext];
    }        
} completion:^(BOOL success, NSError *error) {
    // if successfuly persisted
    if (success) {
        ChatMessageModel *savedMessage = [newMessage MR_inThreadContext];

        // upload data to Pasre. Here is just creating a PFObject, filling its fields and uploading to parse in background
        [self uploadToParseWithText:text orImageFilePath:savedMessage.imageAddress onDate:messageDate forMessage:savedMessage withCompletionBlock:^(NSError *error, PFObject *chatMessage) {
            // if parse saved data
            if (!error) {

                // update objectId in message from parse
                [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
                    [[savedMessage MR_inContext:localContext] setObjectId:chatMessage.objectId];
                }];
            } else {
                // handle errors
            }
        }];
    }
}];

一切顺利,直到消息经常发送(解析没有响应前一个消息)导致(通过fetchresultcontroller)在UI中显示错误的值。

任何想法如何使这些代码更好并更新确切的消息,应该更新?

1 个答案:

答案 0 :(得分:0)

我太缺乏经验,无法在此处详细介绍。我不想给出错误的答案。我遇到了类似的并发问题。根据我的经验,除非您使用委托方法,否则您永远不知道网络任务何时完成。这是因为服务器响应时间根据各种因素从一个请求更改为下一个请求。 但是可能会有所帮助:您可以编写另一个对象(例如UITableViewController)仅在某个操作完成时执行的委托方法。 Ex - 仅在Parse操作完成时更新UI中的值。