gpt4 book ai didi

macos - 通过在主队列上执行的 block 更新 NSProgressIndicator 时出现 CoreAnimation 警告

转载 作者:行者123 更新时间:2023-12-03 16:45:45 25 4
gpt4 key购买 nike

我有以下场景,用于将核心数据实体导出到 JSON 并在执行此操作时显示进度条。

有时,在导出完成时关闭带有进度条的工作表后,我会收到以下警告作为控制台消息:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.

AppDelegate.m

//  AppDelegate.m

- (void)exportAsJSON:(id)sender;
{
NSSavePanel *savePanel = [NSSavePanel savePanel];

[savePanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) {
WMJSONExportOperation *operation = nil;

if (result == NSFileHandlingPanelOKButton)
{
[_progressIndicator setDoubleValue:0];
operation = [[WMJSONExportOperation alloc] init];

// setProgressCallbackBlock
[operation setProgressCallbackBlock: ^(double progress) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
[_progressIndicator setDoubleValue: progress];
}];
}];

// setExportCompletionBlock
[operation setExportCompletionBlock:^(NSData *data, NSError *error) {
// Insert code here to save data to disk
[_window endSheet:_exportProgressSheet];
}];

[_window beginSheet:_exportProgressSheet completionHandler:^(NSInteger result) {
NSLog(@"ExportProgressSheet completionHandler executed");
}];

NSOperationQueue *queue;
queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
}

}];
}

WMJSONExportOperation.m,NSOperation 的子类:

- (void)main;
{
NSError *error = nil;
NSData *data = nil;

// just for illustrating the problem:
for (int i=1; i<=10; i++) {
sleep(1);
[self progressCallbackBlock](i * 10);
}

[self exportCompletionBlock](data, error);
}

@end

所以第一个问题是:这只是一个警告,我应该关心吗?

第二个问题是,如何避免警告。 SO 上有一些问题描述了类似的问题,但建议的解决方案通常是仅从主队列操作 NSProgressIndicator。这不正是我用这段代码所做的吗:

    // setProgressCallbackBlock
[operation setProgressCallbackBlock: ^(double progress) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
[_progressIndicator setDoubleValue: progress];
}];
}];

最佳答案

setting the CA_DEBUG_TRANSACTIONS environment variable 进一步调查该消息后,我发现问题不是发送到 NSProgressIndicator 的消息,而是关闭工作表,我确实是从主队列之外的另一个队列触发的。

所以这个更改解决了我的问题:

[_window endSheet:_exportProgressSheet];

变成:

[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
[_window endSheet:_exportProgressSheet];
}];

关于macos - 通过在主队列上执行的 block 更新 NSProgressIndicator 时出现 CoreAnimation 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com