我正在使用Parse数据填充我的应用程序中的tableview,然后允许我的用户使用搜索字段筛选该数据。长话短说它工作正常,除了我收到A long-running operation is being executed on the main thread
错误。我知道它就在这一行NSArray *results = [query findObjects];
所以我想我会运行一个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);
}
}];
}
再次感谢!
答案 0 :(得分:1)
在第一种情况下,查询在主线程上运行,因此程序会等到查询返回后再继续。这不太理想,因为您的应用程序可能会停止一段不确定的时间,直到查询返回 - 因此警告消息。
第二种情况是首选,因为查询在另一个线程的后台运行。关于您缺少的结果,可能查询返回结果,但您在查询完成运行之前检查主线程。同样,您永远无法确定查询运行需要多长时间。将objects
添加到self.searchResults
后,需要在块内重新加载表格。换句话说,在将来的某个时刻,查询将完成然后运行块。您将结果添加到self.searchResults
,但tableView不会立即重新加载,尽管查询检索到它们,您也不会显示。
在旁注中,在一个区块中,您不应该引用自我。该对象具有对该块的强引用,并且现在该块具有对该对象的强引用 - 即保留周期/内存泄漏。要纠正此问题,请添加:
__weak MyObject *weakSelf = self;
并使用weakSelf
代替。
答案 1 :(得分:0)
谢谢@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);
}
}];
}