如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController
Posted
技术标签:
【中文标题】如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController【英文标题】:How to initialize a NSFetchedResultsController in iOS 10 Swift 3 【发布时间】:2016-06-26 09:11:36 【问题描述】:我无法在 ios 10 中使用来自 AECoreDataUI 的 CoreDataTableViewController 中的 Swift 3 初始化我的 NSFetchedResultsController
。
let request = NSFetchRequest<NasaPicture>(entityName:"NasaPicture")
request.predicate = Predicate(format: "isPagedResult == YES")
request.sortDescriptors = [SortDescriptor(key: "date", ascending: false)]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
编译器抱怨
"Cannot convert value of type NSFetchedResultsController<NasaPicture> to expected type NSFetchedResultsController<_>"
控制器现在为 swift 使用泛型类型,但它没有正确推断实体类型。我已经明确尝试过:
fetchedResultsController = NSFetchedResultsController<NasaPicture>(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
也没有运气。
谢谢!
【问题讨论】:
这是你的变量声明。你不能再使用var fetchedResultsController: NSFetchedResultsController?
,你必须使用var fetchedResultsController: NSFetchedResultsController<NasaPicture>?
【参考方案1】:
NSFetchRequest
现在是泛型。 NSFetchedResultsController
也是通用的。因此,在声明变量时,必须使用泛型声明,例如:
var fetchedResultsController: NSFetchedResultsController<NasaPicture>?
【讨论】:
我的视图控制器有一个超类 CoreDataCollectionViewController 声明了 frc。因为它可以重复使用,所以当它在超类中声明时,我无法将 frc 绑定到特定类型。除非我在基类中添加泛型类型参数? 好的,所以问题出在我的基类中 - 我必须添加 T:NSFetchRequestResult 的类型参数,在使用 NSFetchRequestResult 的任何地方都使用 T,并让子类提供他们想要使用的实体. @JasonC.Howlin 你能具体说明你做了什么吗?我有一段时间懒惰地声明 frc、指定谓词、排序描述符等。【参考方案2】:当我们需要声明变量时,我们必须使用泛型声明 请在 swift 3 中检查以下 NSFetchedResultsController 代码..
override func viewDidLoad()
super.viewDidLoad()
do
try self.fetchedResultsController.performFetch()
catch
let fetchError = error as NSError
print("Unable to Perform Fetch Request")
print("\(fetchError), \(fetchError.localizedDescription)")
// MARK: - NSFetchedResultsController
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> =
let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD")
fetchRequest.sortDescriptors = [
NSSortDescriptor(key: "name", ascending: true)]
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
try! fetchedResultsController.performFetch()
fetchedResultsController.delegate = self
if let quotes = fetchedResultsController.fetchedObjects
if quotes.count > 0
print(quotes.count)
return fetchedResultsController
()
// MARK: - NSFetchedResultsController delegate methods
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)
tableView.beginUpdates()
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)
tableView.reloadData()
【讨论】:
【参考方案3】:只需调用函数:
private func setupFetchedResultsController()
let context = NSManagedObjectContext.mr_default()
let fetchRequest = NSFetchRequest<Month>(entityName: "Month")
let dateDescriptor = NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [dateDescriptor]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "year", cacheName: nil)
fetchedResultsController.delegate = self
try! fetchedResultsController.performFetch()
tableView.reloadData()
【讨论】:
以上是关于如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类
如何在 iOS swift 中使用多个属性初始化 CBMutableCharacteristic
如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像
我如何通过 swift 2.3 项目支持 iOS 版本 10.3