NSOperation 阻止 UI 绘制?

2024-01-08

我正在寻求一些关于使用的建议NSOperation和绘图:

我有一个主线程创建我的NSOperation子类,然后将其添加到NSOperationQueue.

My NSOperation做了一些繁重的处理,它的目的是在 main() 方法中循环几分钟,不断处理一些工作,但现在我只有一个 while() 循环,里面有一个 sleep(1) ,它被设置为绕过只需 5 次(用于测试)。

产生这个的主(原始)线程NSOperation负责绘制视图并更新 UI。

我打算让 NSOperation 线程使用通知来告诉主线程它已经完成了一定量的处理,目前该通知在每次经过 while() 循环时发送一次(即每秒一次,因为它只是在睡觉(1))。主线程(视图)注册以接收这些通知。

通知立即到达主线程,并且看起来是异步的,看起来很好。看来两个线程都按预期运行......也就是说,同时运行。 (我使用 NSLog() 只是为了粗略地检查每个线程何时发送和接收通知)。

当视图收到通知并调用其处理程序方法时,我只需增加一个整数变量,然后尝试将其绘制到视图中(当然作为字符串)。在测试中,drawRect: 中的代码可以很好地将这个整数(作为字符串)绘制到屏幕上。

然而:这是我的问题(抱歉,花了一点时间才到达这里):当主线程(视图)收到来自 NSOperation 的通知时,它会更新此测试整数并调用 [self setNeedsDisplay]。然而,在 NSOperation 完成之前,视图不会重绘自身!我预计 NSOperation 作为一个单独的线程,无法阻止主线程的事件循环,但看起来这就是正在发生的情况。当 NSOperation 完成并且其 main() 返回时,视图最终会立即重新绘制自身。

也许我没有使用NSOperation正确。我在“非并发”模式下使用它,但尽管有这个名称,我的理解是这仍然会产生一个新线程并允许异步处理。

非常感谢任何帮助或建议,如果您想查看一些代码,请告诉我。


观察者中为响应您的通知而执行的方法未在主线程上执行。

因此,在该方法中,您可以使用以下命令强制另一个方法在主线程上运行performSelectorOnMainThread:withObject:waitUntilDone:.

例如:

我的操作.m

- (void)main {
    for (int i = 1; i <= 5; i++) {
        sleep(1);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"GTCNotification" object:[NSNumber numberWithInteger:i]];
    }
}

MyViewController.m

- (void)setupOperation {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationResponse:) name:@"GTCNotification" object:nil];

    NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
    MyOperation *myOp = [[MyOperation alloc] init];

    [opQueue addOperation:myOp];

    [myOp release];
    [opQueue release];
}

- (void)myNotificationResponse:(NSNotification*)note {
    NSNumber *count = [note object];
    [self performSelectorOnMainThread:@selector(updateView:) withObject:count waitUntilDone:YES];
}

- (void)updateView:(NSNumber*)count {
    countLabel.text = count.stringValue;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSOperation 阻止 UI 绘制? 的相关文章

随机推荐