Несмотря на то, что мозг уже ответил, я хочу подчеркнуть «обновить модель в главном потоке» с примером кода.
Вы можете столкнуться с проблемой, потому что ваша модель изменилась в некотором фоновом потоке. Временная шкала должна выглядеть следующим образом:
{NSThread number = 1, name = main} - [ViewController tableView: numberOfRowsInSection:] (например, вернуть 10)
{NSThread number = 8, name = (null)} - [ViewController changeTheModel] (удалить некоторые объекты из модели или получить новую модель с менее чем 10 объектами)
{NSThread number = 1, name = main} - [ViewController tableView: cellForRowAtIndexPath:] (получить индекс из связанной исключительной ситуации, поскольку 10-й объект не существует)
Чтобы решить эту проблему, вы должны сделать что-то подобное при смене модели:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray* items = [self getNewModel];// get new model on background thread
dispatch_async(dispatch_get_main_queue(), ^ {
self.items = items;// replace the model with new one on main thread
[self.tableView reloadData];// refresh table without index out of bound exception
});
});
Надеюсь, это поможет вам. :)