【问题标题】:Using fetchedResultsController with swift3将 fetchedResultsController 与 swift3 一起使用
【发布时间】:2023-04-10 13:17:01
【问题描述】:

我想在我的 Swift3 代码中使用 fetchedResultsController。我尝试了this way 和其他方式,但我做不到。这是我的代码(它不起作用):

var fetchedResultsController: NSFetchedResultsController<Entity> {

    let fetchRequest: NSFetchRequest<Entity>
    if #available(iOS 10.0, *) {
        fetchRequest = Entity.fetchRequest()
    } else {
        // Fallback on earlier versions
        fetchRequest = NSFetchRequest(entityName: "Entity")
    }

    fetchRequest.fetchBatchSize = 20

    let orderDescriptor = NSSortDescriptor(key: "archiveOrder", ascending: true)
    let nameDesctiptor = NSSortDescriptor(key: "entityName", ascending: false)

    fetchRequest.sortDescriptors = [orderDescriptor, nameDesctiptor]

    let aFetchedResultsController: NSFetchedResultsController<Entity> = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: appDelegate.managedObjectContext, sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

    do {
        try _FetchedResultsController.performFetch()
    } catch {
        let nserror = error as NSError
        print("Unresolved error \(nserror), \(nserror.userInfo)")
    }

    return _FetchedResultsController!
}

您能给我一些建议或建议吗?

【问题讨论】:

  • 我找到了解决方案。我在我的 Entity 类中添加了 @nonobjc public class func fetchRequest() -> NSFetchRequest { return NSFetchRequest(entityName: "Entity") } 并且它起作用了。

标签: ios swift core-data swift3


【解决方案1】:

基本上,Apple 建议使用闭包将 NSFetchedResultsController 声明为非可选惰性初始化属性,该闭包仅运行闭包中的代码一次。

lazy var fetchedResultsController: NSFetchedResultsController<NSFetchRequestResult> = { ... }()

您的代码无法编译,因为 Swift 代码区分大小写,这意味着 _fetchedResultsController_FetchedResultsController 是两个不同的东西。

其余代码似乎是正确的。

lazy var fetchedResultsController: NSFetchedResultsController<Entity> = {

  let fetchRequest: NSFetchRequest<Entity>
  if #available(iOS 10.0, *) {
    fetchRequest = Entity.fetchRequest()
  } else {
    // Fallback on earlier versions
    fetchRequest = NSFetchRequest(entityName: "Entity")
  }
  fetchRequest.fetchBatchSize = 20

  let orderDescriptor = NSSortDescriptor(key: "archiveOrder", ascending: true)
  let nameDesctiptor = NSSortDescriptor(key: "entityName", ascending: false)

  fetchRequest.sortDescriptors = [orderDescriptor, nameDesctiptor]

  let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, 
                                                     managedObjectContext: appDelegate.managedObjectContext, 
                                                       sectionNameKeyPath: nil, 
                                                                cacheName: "Master")
  aFetchedResultsController.delegate = self

  do {
    try aFetchedResultsController.performFetch()
  } catch {
    let nserror = error as NSError
    print("Unresolved error \(nserror), \(nserror.userInfo)")
  }

  return aFetchedResultsController
}()

【讨论】:

  • 当我放 'lazy' 时,我收到错误消息,“'lazy' 可能不能用于计算属性”,所以我删除了它。
  • 另外,根据 Xcode 的建议,我将 fetchRequest = Entity.fetchRequest() 设置为! NSFetchRequest
  • 不是计算属性。考虑方法末尾的一对括号。
  • 现在我的 Xcode 上没有错误,但是当我运行时,我有一个错误说 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An instance of NSFetchedResultsController requires a non -nil fetchRequest 和 managedObjectContext'
  • 遵循提供非零NSManagedObjectContext的核心数据模板中的代码
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多