gpt4 book ai didi

ios - 保持 CoreData NSManagedObject 新鲜

转载 作者:行者123 更新时间:2023-11-29 10:49:08 25 4
gpt4 key购买 nike

想象一下像 Instagram 这样的社交照片应用。您在 Feed 中看到您 friend 的一张照片。该照片以如下形式保存在 CoreData 中:

Photo (NSManagedObject)
Attributes: id, imageURL
Relationships: comments (set of Comment objects), likes (set of Like objects)

我有一个 View Controller ,它引用了照片对象。此 View Controller 还处理喜欢和评论照片的操作。

所以,当有人喜欢照片时,流程是这样的:将赞发送到服务器。如果 API 发布成功,则使用从服务器收到的任何新信息更新 CoreData 中的照片对象,其中将包括新的赞。此时,与我按下赞按钮之前相比,照片在 CoreData 中应该多了一个与之相关的赞对象。

现在这里是我遇到问题的地方。 View Controller 需要更新照片上的点赞数。在成功 block 中,我正在这样做:

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

所以问题是,我如何正确地在 View Controller 中更新 Photo 对象,以便我始终可以可靠地查询喜欢和评论的数量?一般来说,如果 NSMangagedObject 可能会在其他线程/上下文中更新,您如何才能始终保持 NSMangedObject 的最新版本?

我试过监听 NSManagedObjectContextObjectsDidChangeNotification,但我遇到了同样的问题,当我收到该通知时,照片报告 0 个赞和评论。

最佳答案

对于这种情况,我经常使用的一个解决方案是 KVO。在您的情况下,我会观察托管对象上的“likes”属性。您可以查找有关如何正确执行此操作的标准 KVO 文章。然而,这只是故事的一半。因此,为了让这些值为您正确更改,“管理”该属性的 NSManagedObjectContext 需要自行更新。这是在线程隔离上下文的情况下合并对 NSManagedOjbectContextDidSaveNotification 事件的保存,或者父/子合并规则发挥作用的地方。关键是,您可以在应用程序的任何上下文中对实际数据进行更改。将这些更改合并到您当前关心的上下文(可能是屏幕上显示的内容)中取决于您。

总而言之,MagicalRecord 应该有一些内置方法来为您处理那一半的问题。如果不是,请确保在保存背景上下文时正确更新显示使用信息的上下文。要记住的是,您必须更新上下文,一旦上下文合并到更新时的新更改中,您的 KVO 方法就会以正确的值触发。

关于ios - 保持 CoreData NSManagedObject 新鲜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21209021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com