Я делаю небольшое приложение для чата.В моем приложении я использую NSFetchedResultsController.Есть 2 вида стола, 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 обновляется, но пользовательский интерфейс зависает
Способ 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
}
результат: пользовательский интерфейс зависает, таблица обновлений.
Как я где-то читал, все, что связано с чем-тоПользовательский интерфейс должен быть сделан в главном потоке.Но я все еще не могу понять, как это сделать, не заморозив tableView.
Спасибо за чтение.
Любая помощь приветствуется