CloudKit CoreAnimation错误

时间:2014-12-30 18:37:23

标签: cloudkit

我们开始使用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有关吗?

2 个答案:

答案 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
});