NSFetchResultController一次加载所有消息,fetchbatchsize没有修复它

时间:2016-08-15 20:23:55

标签: ios swift core-data nsfetchedresultscontroller jsqmessagesviewcontroller

我正处于优化核心数据代码的阶段,

我正在创建一个消息传递应用程序,我只想一次加载50条消息。 但是,查看下面的timeprofile数据,fetchrequest会立即加载所有消息。之后,它甚至无需滚动即可以50个批量加载所有消息。所以它甚至没有做任何事情。

非常感谢任何帮助。

lazy var fetchedResultsControler: NSFetchedResultsController = {
    let fetchRequest = NSFetchRequest(entityName: "Mesages")
    fetchRequest.fetchBatchSize = 20
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
    fetchRequest.predicate = NSPredicate(format: "user.id = %@", self.friend!.id!)
    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
    frc.delegate = self
    return frc
}()

 override func viewDidLoad() {
    super.viewDidLoad()

    do {
        try fetchedResultsControler.performFetch()


    } catch let err {
        print(err)
    }

    self.fetchData = fetchedResultsControler.fetchedObjects as! [Mesages]}

这是CoreData时间分析数据:

enter image description here

1 个答案:

答案 0 :(得分:2)

根据NSFetchRequest documentation

,这是正确的行为
  

执行提取时,将评估整个请求并记录所有匹配对象的标识,但一次只能从持久性存储中提取batchSize对象的数据。从执行请求返回的数组将是一个代理对象,它根据需要透明地对批处理进行故障处理。 (在数据库术语中,这是一个内存中的游标。

相反,如果您希望明确控制提取分组,请改用fetchLimitfetchBatchSize的组合。但那时你正在与NSFetchedResultsController的特征作斗争。

你真正想用fetchData数组做什么?