解析filterResults findObjects vs findObjectsInBackgroundWithBlock

时间:2015-06-07 07:28:34

标签: ios objective-c uitableview search parse-platform

我正在使用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);
        }
    }];
}

再次感谢!

2 个答案:

答案 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);
            }
        }];
    }