我们开始使用CloudKit,并且已经与Firebase合作了一段时间。
当我们在代码中没有使用CoreAnimation时,我们遇到的问题是CoreAnimation警告。
CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.
只要我们从CloudKit读取/添加/更新/删除任何记录,就会发生这种情况。
例如,这是我们将联系人初始加载到NSTableView
中-(void)loadContacts {
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Contact" predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]];
self.arrayToDisplay = [NSMutableArray new];
[self.publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) {
if ( error ) {
NSLog(@"error loading array: %@", error.localizedDescription);
} else {
self.arrayToDisplay.array = results; //arrayToDisplay is an array of CKRecord objects
[self.myTableView reloadData];
}
}];
}
self.publicDatabase是一个初始化的CKDatabase。
请注意,所有功能都有效,读取/添加/更新/删除,但每次调用后都会显示该消息。
我们已经设置了CA_DEBUG来记录回溯,看起来它与在获取记录之前重绘NSTableView有关吗?
答案 0 :(得分:0)
这似乎解决了这个问题,因为它将tableView重新加载回主线程。只需使用以下内容替换块中的[self.tableView reloadData]。
[self.tableView
performSelectorOnMainThread:@selector(reloadData)
withObject:nil
waitUntilDone:NO
];
答案 1 :(得分:0)
performSelectorOnMainThread:在你的答案中发布时会很好。但是,有时您想做的不仅仅是执行单个方法。在这种情况下,我建议将多行代码包装到GCD调度语句中。这是它的外观:
__weak UITableView *weakTableView; // use a weak reference to prevent retain cycle
dispatch_queue_t q_main = dispatch_get_main_queue();
dispatch_async(q_main, ^() {
[weakTableView reloadData];
// do other stuff too if you want
});