繁体   English   中英

解析filterResults findObjects vs findObjectsInBackgroundWithBlock

[英]Parse filterResults findObjects vs findObjectsInBackgroundWithBlock

我使用解析数据填充我的应用程序中的表格视图,然后允许我的用户使用搜索字段在该数据中进行筛选。 长话短说,它工作正常,除非我收到一个A long-running operation is being executed on the main thread错误A long-running operation is being executed on the main thread 我知道这是NSArray *results = [query findObjects]; 所以我想我将运行findObjectsInBackgroundWithBlock尝试解决该问题。 很好,但是现在tableview总是空白。 我是否应该担心警告? 如果应该的话,代码有什么问题? 谢谢!

搜索有效但得到警告:

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

再次感谢!

在第一种情况下,查询在主线程上运行,因此程序要等到查询返回后才能继续。 这不是理想的,因为您的应用可能会暂停不确定的时间,直到查询返回-因此出现警告消息。

第二种情况是首选的,因为查询在另一个线程上在后台运行。 关于缺少的结果,也许查询正在返回结果,但是您正在查询运行完成之前检查主线程。 同样,您永远无法确定查询将运行多长时间。 objects添加到self.searchResults之后,需要在块内重新加载表。 换句话说,在将来的某个时候,查询将完成,然后运行该块。 您将结果添加到self.searchResults但不会立即重新加载tableView,尽管它们是由查询检索的,但您不会出现。

附带说明,在一个块中,您不应该引用自己。 对象对块有很强的引用,现在该块对对象有很强的引用-即保留周期/内存泄漏。 要更正此问题,请添加:

__weak MyObject *weakSelf = self;

之前的块,并使用weakSelf

谢谢@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);
            }
        }];
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM