CloudKit CoreAnimation 错误
Posted
技术标签:
【中文标题】CloudKit CoreAnimation 错误【英文标题】:CloudKit CoreAnimation error 【发布时间】:2014-12-30 18:37:22 【问题描述】:我们开始使用 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 有关?
【问题讨论】:
找到更多信息。看起来完成块在后台线程中运行,因此重新加载 tableview 的调用也在后台线程中。如何解决?类似问题***.com/questions/26257952/cloudkit-query-time 【参考方案1】:这似乎解决了问题,因为它将 tableView 重新加载回主线程。只需将块中的 [self.tableView reloadData] 替换为以下内容即可。
[self.tableView
performSelectorOnMainThread:@selector(reloadData)
withObject:nil
waitUntilDone:NO
];
【讨论】:
【参考方案2】: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
);
【讨论】:
以上是关于CloudKit CoreAnimation 错误的主要内容,如果未能解决你的问题,请参考以下文章