2015-06-07 3 views
0

Я заполняю табличное представление в своем приложении с данными Parse, а затем разрешаю своим пользователям просеивать эти данные с помощью поля поиска. Короче говоря, он отлично работает, но я получаю ошибку A long-running operation is being executed on the main thread. Я знаю, что это в этой строке NSArray *results = [query findObjects];, поэтому я решил, что я запустил findObjectsInBackgroundWithBlock, чтобы попытаться исправить это. Ну, это так, но теперь табличка всегда кажется пустой. Должен ли я не беспокоиться о предупреждении? Если я должен быть, что не так с кодом? Благодаря!Parse filterResults findObjects vs findObjectsInBackgroundWithBlock

поисковых работ, но получает предупреждения:

-(void)filterResults:(NSString *)searchTerm { 

    [self.searchResults removeAllObjects]; 
    PFQuery *query = [PFQuery queryWithClassName:@"NHLVideos"]; 
    [query whereKey:@"User" containsString:searchTerm]; 
    NSArray *results = [query findObjects]; 
    [self.searchResults addObjectsFromArray:results]; 
} 

Нет Предупредительные Но нет Результаты поиска:

-(void)filterResults:(NSString *)searchTerm { 

    [self.searchResults removeAllObjects]; 
    PFQuery *query = [PFQuery queryWithClassName:@"NHLVideos"]; 
    [query whereKey:@"User" containsString:searchTerm]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error){ 
      //No Error 
      [self.searchResults addObjectsFromArray:objects]; 
     } else { 
      NSLog(@"Error %@", error); 
     } 
    }]; 
} 

Еще раз спасибо!

ответ

1

В первом случае запрос выполняется в основном потоке, поэтому программа ждет, пока запрос не вернется, прежде чем продолжить. Это не так идеально, так как ваше приложение может остановиться на неопределенное количество времени, пока запрос не вернется - следовательно, появится предупреждающее сообщение.

Второй случай предпочтителен, так как запрос выполняется в фоновом режиме в другом потоке. Что касается ваших недостающих результатов, возможно, запрос возвращает результаты, но вы проверяете основной поток до того, как запрос завершен. Опять же, вы никогда не можете быть уверены, сколько времени потребуется на выполнение запроса. Таблицу необходимо перезагрузить внутри блока после добавления objects в self.searchResults. Другими словами, в какой-то момент в будущем запрос завершится, а затем запустит блок. Вы добавляете результаты в self.searchResults, но tableView не будет сразу перезагружен, и вы не будете отображаться, хотя они были получены по запросу.

На боковой ноте в блоке вы не должны ссылаться на себя. Объект имеет сильную ссылку на блок, и теперь блок имеет сильную ссылку на объект, то есть на удержание цикла/утечку памяти. Чтобы исправить эту надстройку:

__weak MyObject *weakSelf = self;

перед блоком и использовать weakSelf вместо этого.

+0

Благодарим за отзыв. Очень подробный и полезный, хотя, когда я запускаю блок, но добавляю '[self.tableView reloadData];' после того, как 'searchResults' получил объекты, мой tableview по-прежнему не отображает никаких объектов. – Nicholas

0

Thanks @Josh Gafni. Это прекрасно работает!

-(void)filterResults:(NSString *)searchTerm { 

     [self.searchResults removeAllObjects]; 
     PFQuery *query = [PFQuery queryWithClassName:@"NHLVideos"]; 
     [query whereKey:@"User" containsString:searchTerm]; 
     [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
      if (!error){ 
       //No Error 
       [self.searchResults addObjectsFromArray:objects]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
      [self.searchDisplayController.searchResultsTableView reloadData]; 
     }); 
      } else { 
       NSLog(@"Error %@", error); 
      } 
     }]; 
    }