我刚刚开始试用CloudKit并且查询时间非常慢。以下是我正在使用的一些示例代码:
//CLOUDKIT
CKContainer *container = [CKContainer defaultContainer];
CKDatabase *privateDatabase = [container privateCloudDatabase];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"FlightLog" predicate:predicate];
[privateDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
//SUCCESS
if (!error)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"SUCCESS" message:@"IT WORKED" delegate:self cancelButtonTitle:@"dismiss" otherButtonTitles:nil];
[alert show];
NSLog(@"%@", @"fetchFlights success!");
NSLog(@"%@", self.fetchedRecords);
self.fetchedRecords = results;
[self.tableView reloadData];
}
//ERROR
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error" message:error.localizedDescription delegate:self cancelButtonTitle:@"dismiss" otherButtonTitles:nil];
[alert show];
NSLog(@"%@", error);
}
}];
我获取私有数据库,并查询所有记录。我在仪表板中添加了四个简单的。
在调用此代码后,我可以从我的控制台日志中看到成功消息几乎立即被调用,结果为null。稍后,返回结果,如日志中所示。但是,警报视图未显示,结果显示在我的表格中大约3-4秒。
怎么回事?!
感谢。
答案 0 :(得分:1)
解决。正如Edwin所提到的那样,我并不知道回调是在后台线程上进行的。因此,当我在完成块中调用[self.tableView reloadData]
时,它也在后台线程上运行。
通过将其放回主线程,表视图会在大约一秒钟内重新加载。如果在与回调相同的线程上运行,则大约需要4-5秒。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
让我知道我误解了,但我认为这就是发生的事情。