2016-06-28 1 views
0

У меня возникли проблемы с выяснением этой проблемы GCD.Основные данные: Вставка новой строки после выполнения выборки

Предположим, что в табличном представлении есть один UITableViewCell. Эта ячейка имеет некоторые текстовые поля, которые пользователь редактирует. После того, как пользователь закончит редактирование, ячейка создает новый объект в Core Data на основе того, что пользователь вводил. Этот объект вставляется с insertNewObjectForEntityForName.

После этого мне нужно performFetch на NSFetchedResultsController и перезагрузить табличное представление. Тем не менее, я также хочу добавить новую ячейку в конец таблицы, поэтому пользователь может добавить другой элемент в свой список.

Это то, что я делаю, чтобы попробовать, что:

dispatch_async(dispatch_get_main_queue(), { 
    do { 
     try self.fetchedResultsController.performFetch() 
    } catch { 
     fatalError("Fetch failed: \(error)") 
    } 

    self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.fetchedResultsController.sections!.first!.numberOfObjects - 1, inSection: 0)], withRowAnimation: .Automatic) 
    self.tableView.reloadData() 
}) 

добавляется новая клетка, но без строки анимации. Я думаю, что я кое-что недопонимаю с GCD и Core Data. Спасибо за помощь.

+0

Попробуйте это: 'Func controllerWillChangeContent (контроллер: NSFetchedResultsController) { tableView.beginUpdates() } Func controllerDidChangeContent (контроллер: NSFetchedResultsController) { tableView.endUpdates() }' – Santosh

+0

@Santosh Я попробовал этот делегат методы, а новая ячейка добавляется с анимацией строк. Однако обе ячейки заполняются одними и теми же данными (подразумевая, что табличный вид все еще необходимо перезагрузить). Когда я просматриваю представление таблицы, ячейки корректируют себя (подтверждая эту импликацию). –

+0

Да, сохраните свой 'self.tableView.reloadData()' также после того, как вы введете 'insertRowAt..'. – Santosh

ответ

0

исправил путем внедрения:

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) 

Использование инструкции switch внутри этой функции позволяет больше контролировать каждое изменение:

switch type { 
    case NSFetchedResultsChangeType.Insert: 
     print("Insert") 
    case NSFetchedResultsChangeType.Delete: 
     print("Delete") 
    case NSFetchedResultsChangeType.Update: 
     print("Update") 
    case NSFetchedResultsChangeType.Move: 
     print("Move") 
} 

Внутри этого переключателя вы можете использовать indexPath для удаления ячеек, добавления ячеек, что бы вы ни хотели. Просто используйте insertRowsAtIndexPaths или другую соответствующую функцию.

0

Необходимо использовать первое закрытие в качестве процесса потока, выполняющегося асинхронно. После того как процесс сделано, он будет идти на второй закрытия, которая в основном потоке, чтобы сделать что-нибудь с вашей точки зрения

dispatch_async(dispatch_get_global_queue(priority, 0)) { 

     // process here 
     do { 
      try self.fetchedResultsController.performFetch() 
     } catch { 
      fatalError("Fetch failed: \(error)") 
     } 
     dispatch_async(dispatch_get_main_queue(), { Void in 
      // then refresh UI 
      self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.fetchedResultsController.sections!.first!.numberOfObjects - 1, inSection: 0)], withRowAnimation: .Automatic) 
      self.tableView.reloadData() 
     }) 
    } 

Установите этот флажок учебник для деталей https://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1

+0

Это не работает. –