- Должен ли я передавать только их «идентификаторы» в основной поток, чтобы обновить их в основном ManagedContext? Что я могу сделать с временной информацией, которая была рассчитана (для отображения вместе с другими данными в ячейках таблицы).
- Разве я не мог просто передать их обратно, чтобы показать?
нет необходимости передавать идентификаторы, вы можете легко вызвать NSOperation для выполнения вашего расчета, а также получить и сохранить свой набор объектов, а затем в конце расчета вам просто нужно позвонить:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
Что приведет к тому, что таблица снова вызовет свои селекторы делегатов. Важно то, что вы должны хранить полученные объекты в источнике данных, к которому имеют доступ селекторы делегатов, например, это может быть NSArray:
@property(nonatomic,strong) NSArray *datasource;
-(void)loadDataAsynchronously {
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadData)
object:nil];
[queue addOperation:operation];
}
-(void)loadData{
// do your calculation and store into array
self.datasource=......
// reload on main thread
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
YourObject *obj = [[self datasource] objectAtIndex:indexPath.row];
YourTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"];
cell.cellTitle.text=obj.titleForCell;
cell.cellDescr.text=obj.descriptionForCell;
return cell;
}
- Что касается последнего вопроса, могу ли я «заблокировать» ManagedContext, чтобы гарантировать, что данные передаются без проблем (я читал, что это может быть вариант)?
После извлечения объекта нет необходимости блокировать CoreData, если у вас есть таблица только для чтения. В противном случае, если вы знаете о фоновом потоке, который мог изменить ваши уже отображаемые данные, и ваша таблица может быть отредактирована и сохранена, вам нужно внедрить сложную логику для работы с этим. Или вы получите «ошибку несоответствия». Но если у вас есть таблица только для чтения, вы можете, например, предупредить контроллеры, если кто-то изменил данные, и попросить их перезагрузить таблицу.
- Подходят ли Core Data для такого использования? Должен ли я рассмотреть другой подход/технологию?
Да, единственный момент, о котором вам следует позаботиться, это то, какие вычисления вы делаете. Самая частая ошибка — думать о CoreData как о базе данных SQL, а не о графе объекта (ошибка, которую я совершал чаще всего), поэтому многие операции с частицами и точными sql-подобными операциями невозможны. Во многих случаях вы закончите получать набор критериев, на основе которого вам придется выполнять дальнейшие вычисления памяти. Но, честно говоря, несмотря на то, что многие говорят, что если у вас нет тысячи записей, я обнаружил, что все устройства iOS работают очень быстро для разумного объема данных.
29.02.2012