gpt4 book ai didi

ios - 解析 filterResults findObjects 与 findObjectsInBackgroundWithBlock

转载 作者:行者123 更新时间:2023-11-29 01:57:31 25 4
gpt4 key购买 nike

我在我的应用程序中使用 Parse 数据填充表格 View ,然后允许我的用户使用搜索字段筛选该数据。长话短说,它工作正常,只是我收到一个 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 后,需要在 block 内重新加载该表。换句话说,在未来的某个时刻,查询将完成,然后运行该 block 。您将结果添加到 self.searchResults,但 tableView 不会立即重新加载,并且您不会显示,尽管它们已被查询检索到。

附带说明,在 block 中,您不应该引用 self。对象对 block 有强引用,现在 block 对对象有强引用——即保留周期/内存泄漏。要更正此添加:

__weak MyObject *weakSelf = self;

在 block 之前并使用 weakSelf 代替。

关于ios - 解析 filterResults findObjects 与 findObjectsInBackgroundWithBlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30691146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com