gpt4 book ai didi

ios - NSFetchedResultsController 不跟踪来自应用程序扩展的 CoreData 更改

转载 作者:行者123 更新时间:2023-11-28 08:30:55 25 4
gpt4 key购买 nike

一年多以来,我几乎每天都在积极使用 StackOverflow,但这是我在这里提出的第一个问题。没有其他问题可以解决我的确切问题。关闭解决方案不起作用或不适用于我的情况。

我在做什么

我正在开发一个带有共享扩展的 iOS 应用。扩展应用程序将链接保存到包含(主)应用程序的 CoreData,展示了使用 NSFetchResultsController 保存的此链接的列表。

主应用程序是 Xcode 提供的 Master-Detail 模板,具有非常小的改编。

我创建了一个嵌入式框架来承载 CoreData 的东西,并设置了一个应用程序组来托管 CoreData 并以通常的方式在应用程序之间共享它。

CoreData 部分工作正常:我可以将对象插入到 ContextObjectManager 中,只要我的主应用程序激活,我就可以在那里立即查询这个插入的对象。

问题

当 MasterViewController 无法更新 tableView 时,问题就开始了。我推断 NSFetchedResultsController 实例不会跟踪在主应用程序外部发生的 CoreData 更改。

我尝试了一些方法,同时聆听应用程序何时激活:

func becomeActive(notification: NSNotification) {

//Approach 1: Making sure to delete cache -- even though I do not have a persistent named cache file.
NSFetchedResultsController.deleteCacheWithName(nil)

//Approach 2: Making sure to reload tableView data.
self.tableView.reloadData()

}

没有任何效果。

self.fetchedResultsController.sections![0].numberOfObjects 它始终等于显示的单元格数。然后,如果我与扩展分享一些新内容然后回来,这个数字不会改变,但 DataManager.getAllManagedObjectsFromEntity(Link.entityDescription()).objects.count 等于这个数量 + 1。

然后,当我关闭应用程序并再次打开它时,它会同步并且显示的单元格数 = 获取的对象数 = 从实体获取的所有托管对象数。

我认为可能的解决路径

  • 如果我可以从扩展应用程序的 CoreData 修改通知主应用程序,我可以直接在 MasterViewController 中更新上下文。我找不到一种非热修复的方法来做到这一点。
  • 我在一个 stackoverflow 问题中读到“背景上下文”和“背景上下文更改与主要上下文更改”,但我无法准确理解它与我的问题有何关系。我只使用一个上下文。
  • 我相信如果我可以重置上下文或重新获取结果,问题就解决了。但是如何呢?

就是它了。有人对我需要做什么来同步获取的结果有任何建议/解决方案吗?

相关代码

MasterViewController.swift 中的 NSFetchedResultsController 实例

var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}

let fetchRequest = NSFetchRequest()
// Edit the entity name as appropriate.
let entity = NSEntityDescription.entityForName("Link", inManagedObjectContext: DataAccess.shared.managedObjectContext)
fetchRequest.entity = entity

// Set the batch size to a suitable number.
fetchRequest.fetchBatchSize = 20

// Edit the sort key as appropriate.
let sortDescriptor = NSSortDescriptor(key: "title", ascending: false)

fetchRequest.sortDescriptors = [sortDescriptor]


/// Template original code
// let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master")

/// My adaptation
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DataAccess.shared.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
aFetchedResultsController.delegate = self
_fetchedResultsController = aFetchedResultsController

do {
try _fetchedResultsController!.performFetch()
} catch {
abort()
}

return _fetchedResultsController!
}

在嵌入式框架的 DataManager.swift 文件中执行 getAllManagedObjectsFromEntity(_:)

public class func getAllManagedObjectsFromEntity(entity: NSEntityDescription) -> (sucesso: Bool, objects: NSArray){

// let delegate = (UIApplication.sharedApplication()).delegate as! AppDelegate
let context:NSManagedObjectContext? = DataAccess.shared.managedObjectContext

let request:NSFetchRequest = NSFetchRequest()
request.entity = entity

var error:NSError?
var objects:NSArray?
do {
objects = try context?.executeFetchRequest(request)
} catch let error1 as NSError {
error = error1
objects = nil
}

if(error == nil){
return(true, objects!)
}else{
NSLog(error!.description)
return(false, objects!)
}

}

最佳答案

NSFetchedResultsController 可能有一个 NSFetchedResultsControllerDelegate 附加。

你已经声明了你实现了 NSFetchedResultsControllerDelegate:

aFetchedResultsController.delegate = self

因此添加 controllerDidChangeContent 方法,调用时您将在其中重新加载表格:

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)
{
self.tableView.reloadData
}

NSFetchedResultsControllerDelegate 还提供了一个关于确切更改内容的字典,为您提供非常精细的控制。

关于ios - NSFetchedResultsController 不跟踪来自应用程序扩展的 CoreData 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38899925/

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