在今天的扩展程序中创建记录并在应用程序中更新时的更改在今天的扩展程序中不可见

Bar*_*zyk 1 core-data ios magicalrecord swift

只是我有一个应用程序和今天的扩展。我还有两个实体:GoalService

@objc(Goal)
class Goal: NSManagedObject {

    @NSManaged var identifier: String
    @NSManaged var startDate: Date
    @NSManaged var endDate: Date

    private var services: [Service] {
    
        let predicate = NSPredicate(format: "date >= %@ && date <= %@", startDate as NSDate, endDate as NSDate)

        return Service.mr_findAll(with: predicate) as! [Service]
    }

    var duration: Int64 {
        return services.reduce(0) { $0 + $1.duration }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在今天的扩展程序中创建service相关并goal在应用程序中更新它时,更新的结果在今天的扩展程序中不可见,而在应用程序中正确显示。为什么?

这是我在扩展或扩展中创建和更新记录的方式:

MagicalRecord.save({ context in
        
    Service.createOrUpdate(withDuration: duration, date: Date(), identifier: identifier, in: context)
        
}, completion: { _, error in
        
        //do something on completion
})
Run Code Online (Sandbox Code Playgroud)

Jon*_*ose 6

扩展程序和应用程序是不同的程序,它们共享一些相同的代码。所以两者都在创建自己persistentStoreCoordinator 和上下文。

通常在同一个应用程序中,您将有多个上下文都附加到同一个persistentStoreCoordinator 并且其中一个的更改将由通过通知中心发送然后合并的通知处理。在这种情况下有两个问题 - 1)notificationCenter 不在应用程序和扩展程序之间共享,因此它们无法轻松通信;2)上下文不共享相同,persistentStoreCoordinator因此即使您也无法使用“mergeChangesFromContextDidSaveNotification”确实传递了这些信息。

我以前没有尝试过,但这是我要尝试的:

  1. 设置某种方式来触发发生的变化。对此有很多解决方案。
  2. 将您的managedObjectContext(s)设置stalenessInterval为 0
  3. 当发生变化时,您必须更新核心数据。您可以通过调用refreshObject:mergeChanges:所有核心数据对象来执行此操作,或者执行另一次提取。诀窍是您必须从存储中获取上下文,并从存储中获取从文件中获取的上下文,并且不能访问两者之间的任何缓存。