1

я нахожусь на стадии оптимизации моего основного кода данных,NSFetchResultController загружать все сообщения сразу, fetchbatchsize не фиксируя его

Я делаю приложения для обмена сообщениями, и я только хочу, чтобы загрузить 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

ответ

2

Это правильное поведение, согласно NSFetchRequest documentation:

Когда выборка выполняется, весь запрос обрабатывается, и тождества всех совпадающих объектов, но не более, чем данные объектов batchSize будут извлекаться из постоянного хранилища за раз. Массив, возвращенный из выполнения запроса, будет прокси-объектом, который прозрачно разбивает пакеты по требованию. (В терминах базы данных, это курсор в памяти.

Если, вместо этого, вы хотите точно управлять выборки группировки, используйте комбинацию fetchLimit и fetchBatchSize вместо этого. Но в этот момент вы боретесь особенности NSFetchedResultsController

Что вы на самом деле пытаетесь сделать с fetchData массива

+0

'для объекта в fetchData { если object.isSender == TRUE { self.JSQmessages.append (JSQCell (SenderId:.?" danzo ", senderDisplayName:" incoming ", date: object.timestamp, tex t: object.text)) } ' – slimboy

+0

Я использую приведенный выше код для добавления сообщений в свой JSQcell, который заполняет все мои таблицы сообщениями. мое приложение зависает всякий раз, когда загружает контроллер из-за большого количества загружаемых сообщений. Вы знаете какие-либо способы оптимизировать это поведение? Большое вам спасибо за помощь, мне это действительно нужно прямо сейчас! – slimboy

+1

Вы сражаетесь с каркасом. Я предполагаю, что JSQCell является подклассом UITableviewCell? Вместо того, чтобы извлекать весь массив и создавать полный массив ячеек таблицы, используйте 'tableView: cellForRowAtIndexPath:', чтобы заполнить ячейки, как они представлены на экране. NSFetchedResultsController специально написан для упрощения. Начать здесь: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html –

Смежные вопросы