【发布时间】:2014-01-18 19:47:43
【问题描述】:
想象一下像 Instagram 这样的社交照片应用。您在动态中看到您朋友的一张照片。该照片以如下方式保存在 CoreData 中:
Photo (NSManagedObject)
Attributes: id, imageURL
Relationships: comments (set of Comment objects), likes (set of Like objects)
我有一个引用 Photo 对象的视图控制器。此视图控制器还处理喜欢和评论照片的操作。
因此,当有人喜欢一张照片时,流程是这样的:将喜欢的内容发送到服务器。如果 API 发布成功,则使用从服务器接收到的任何新信息更新 CoreData 中的 Photo 对象,其中将包括新的点赞。此时,CoreData 中的 Photo 应该比我按下 Like 按钮之前多了一个与之相关的 Like 对象。
现在我遇到了问题。视图控制器需要更新照片上的点赞数。在成功块中,我正在这样做:
self.likesLabel.text = [NSString stringWithFormat:@"%d likes", self.photo.likes.count];
问题在于 self.photo.likes.count 此时报告为 0(在我按下“赞”按钮之前它不是零)。如果我在其他地方导航并返回此屏幕,计数将正确更新。因此,当我更新 Photo managedObject 时,它似乎变得“脏”了。更新可能发生在另一个上下文中(我使用 Magical Record)。更新看起来像这样:
NSManagedObjectContext* context = [NSManagedObjectContext MR_contextForCurrentThread];
Photo* photo = [Photo MR_findFirstWithPredicate:somePredicate inContext:context];
...
photo.likes = likes;
photo.comments = comments;
[photo save:context];
所以问题是,如何在视图控制器中正确更新 Photo 对象,以便始终可靠地查询喜欢和 cmets 的数量?一般来说,如果 NSMangagedObject 可能在其他线程/上下文中更新,您如何始终保持新版本?
我尝试监听 NSManagedObjectContextObjectsDidChangeNotification,但我遇到了同样的问题,当我收到通知时照片报告 0 个喜欢和 cmets。
【问题讨论】:
-
正在获取 != 也刷新了 BTW
标签: ios core-data nsmanagedobject nsmanagedobjectcontext magicalrecord