【问题标题】:CloudKit CoreAnimation errorCloudKit CoreAnimation 错误
【发布时间】: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 有关?

【问题讨论】:

标签: cloudkit


【解决方案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
    });
    

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多