Выполнение выборки без замораживания UI

Я делаю небольшое приложение для чата. В моем приложении я использую 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.

Спасибо, что прочитали.

Любая помощь приветствуется

11
задан Novarg 13 January 2012 в 08:12
поделиться