gpt4 book ai didi

multithreading - 关于后台线程更新 NSView 的通知

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

有一个任务需要在 NSView 上绘制 N 张图像。但一开始我不知道图像的数量,所以我将其设置在后台线程中工作。

 [NSThread detachNewThreadSelector:@selector(workInBackgroundThread:) toTarget:self withObject:nil];

当它获得图像数量时,它会发送通知

- (void)workInBackgroundThread:(id)unusedObject {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//get image amount....

[[NSNotificationCenter defaultCenter] postNotificationName:@"gotImageAmount" object:nil];

//...
//continue to load images

}

我尝试根据通知功能中的图像数量调整 NSView 的大小

-(void)processGotImagesAmount:(NSNotification*)notification  
{

//others codes

[myNSView setFrame:CGRectMake(0, 0, calculateNewWidth, caculatedNewHeight)];//line A

//others codes

}

但是当应用程序执行 A 行时,它卡住了,

[myNSView setFrame:CGRectMake(0,   0, calculateNewWidth, caculatedNewHeight)];

本身没有问题,如果我点击一个bottun来调用它,就可以了!

但看起来它在通知功能中不起作用

欢迎大家留言

最佳答案

您正在从后台线程发布通知。

来自 NSNotificationCenter 文档:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

In a multithreaded application, notifications are always delivered in the thread in which the notification was posted

在您的通知处理代码中,您正在更新 ui,您必须从主线程执行此操作。尝试将该代码移至另一个方法,然后在通知处理代码中使用 PerformSelectorOnMainThread 调用它。

另一个选项是没有通知的 GCD。我在这个 S.O. 中发布了一个示例。答案:

GCD, Threads, Program Flow and UI Updating

关于multithreading - 关于后台线程更新 NSView 的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073847/

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