将 fetchedResultsController 与 swift3 一起使用
Posted
技术标签:
【中文标题】将 fetchedResultsController 与 swift3 一起使用【英文标题】:Using fetchedResultsController with swift3 【发布时间】:2016-10-25 05:08:46 【问题描述】:我想在我的 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基本上,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
的核心数据模板中的代码以上是关于将 fetchedResultsController 与 swift3 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等