我在iOS10(Swift3)应用程序中集成了coredata框架,可以从服务器和显示中获取数据。当应用程序第一次启动时,核心数据没有任何记录。在与服务器交换一些信息后,它开始在后台线程中同步。我能够看到数据正在通过Web服务从服务器下载,解析并存储在核心数据中。但如果我退出并启动应用程序,它会显示所有记录。Coredata performFetch无法获取新记录
在我的视图控制器中,我使用“NSFetchedResultsController”来显示“TableView”中的记录。我创建读取的结果控制器,如下所示:
fileprivate lazy var inspirationsResults: NSFetchedResultsController<Inspiration> = {
// Create Fetch Request
let fetchRequest: NSFetchRequest<Inspiration> = Inspiration.fetchRequest()
// Configure Fetch Request
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timeStamp", ascending: false)]
// Create Fetched Results Controller
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: CoreDataManager.shared.getContext(), sectionNameKeyPath: nil, cacheName: nil)
// Configure Fetched Results Controller
fetchedResultsController.delegate = self
return fetchedResultsController
}()
在viewDidLoad方法,我写下面的代码来获取:
do {
try self.inspirationsResults.performFetch()
} catch {
let fetchError = error as NSError
print("\(fetchError), \(fetchError.userInfo)")
}
我还添加委托方法“controllerWillChangeContent,controllerDidChangeContent & didChangeObject”到处理更新/修改。
我使用persistentContainer保存对象:
func addInspirations(_ inspirations:[[String: AnyObject]]) {
persistentContainer.performBackgroundTask({ (bgContext) in
bgContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
for tInspiration in inspirations {
let inspiration = Inspiration(context: bgContext)
inspiration.inspirationID = tInspiration[kInspirationId] as! Int32
inspiration.inspirationName = tInspiration[kInspirationName] as? String
}
if bgContext.hasChanges {
do {
try bgContext.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
})
}
我错过了什么?
没有你的背景和'mergeChangesFromContextDidSaveNotification连接主线程上下文: '?或者它是父子连接? – bteapot
@bteapot,我用“保存”细节更新了我的代码。因为我已经将后台任务的mergePolicy设置为NSMergeByPropertyObjectTrumpMergePolicy – Satyam
'mergePolicy'没有在你的问题中扮演任何角色。我会写一个答案。 – bteapot