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 错误的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit - 完整且完整的错误处理示例

Cloudkit:“错误保存记录写入操作不允许”

CloudKit:CKQuery 显示错误:错误:操作无法完成。 (CKErrorDomain 错误 1。)

解析 CloudKit 错误 (CKError)

CloudKit 错误:更改令牌已过期,需要重置

CloudKit 查询的奇怪错误