Я делаю небольшое приложение для чата. В моем приложении я использую NSFetchedResultsController. Есть 2 tableViews, 1 для лобби и 1 для чата. Проблема в том, что каждый раз, когда я захожу в чат, мне приходится ждать, пока NSFetchedResultsController выполнит выборку и загрузит все данные, прежде чем я смогу начать что-либо вводить. Мне интересно, можно ли выполнить выборку в фоновом режиме или каким-то образом позволить пользователю начать вводить текст до того, как будут загружены последние сообщения.
Итак, если я устанавливаю эту часть в метод viewDidLoad, мой пользовательский интерфейс просто замирает, пока все данные не будут загружены:
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
а если я устанавливаю эту часть кода в отдельный метод и затем вызываю этот метод в viewDidLoad в фоновом режиме
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
tableView просто не обновляется, поэтому я должен вернуться к первому tableView, а затем вернуться, чтобы получить какие-либо результаты.
Спасибо.
Любая помощь будет оценена по достоинству
обновить
Я попробовал несколько других способов сделать это.
Способ 1:
-(void)reloadTheTable
{
[self.tableView reloadData];
}
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[self performSelectorOnMainThread:@selector(reloadTheTable) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void)viewDidLoad {
//some code
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
//some other code
}
результат: tableView не показывает никаких данных, нужно снова открыть контроллер представления
Способ 2:
- (void)viewDidLoad {
//some code
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
});
//some other code
}
результат: tableView обновляется, но UI замирает
Способ 3:
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
}
- (void)viewDidLoad {
//some code
[self performSelectorOnMainThread:@selector(fetchIt) withObject:nil waitUntilDone:NO];
//some other code
}
результат: UI замирает, таблица обновляется.
Как я где-то читал, все, что связано с UI, должно выполняться в основном потоке. Но я все еще не могу понять, как это сделать без замораживания tableView.
Спасибо, что прочитали.
Любая помощь приветствуется