Yup*_*Yup 12 multithreading cocoa-touch nsoperation nsoperationqueue ios
我对使用NSOperation和绘图有一些建议:
我有一个主线程创建我的NSOperation子类,然后将其添加到NSOperationQueue.
我NSOperation做了一些繁重的处理,它打算在main()方法中循环几分钟,不断处理一些工作,但是现在我只有一个while()循环,里面有一个sleep(1),设置为go大约只有5次(用于测试).
产生它的主(原始)线程NSOperation负责绘制视图并更新UI.
我打算让NSOperation线程使用通知来告诉主线程它已经完成了一些处理,此时每次通过while()循环时都会发送一次这个通知(也就是说,每秒一次,因为它只是在做睡眠(1)).主线程(视图),注册接收这些通知.
通知立即进入主线程,看起来异步,看起来很好.似乎两个线程都按预期运行......即 - 同时运行.(我使用NSLog()来粗略检查每个线程何时发送和接收通知).
当视图收到通知并调用其处理程序方法时,我只是递增一个整数变量,并尝试将其绘制到视图中(当然是一个字符串).在测试中,drawRect中的代码:将此整数(作为字符串)绘制到屏幕上就好了.
但是:这是我的问题(抱歉这需要花一点时间才能到达):当主线程(视图)收到来自NSOperation的通知时,它会更新此测试整数并调用[self setNeedsDisplay].但是,在NSOperation完成之前,视图不会重绘!我期望NSOperation作为一个单独的线程,无法阻止主线程的事件循环,但看起来这就是正在发生的事情.当NSOperation完成并且其main()返回时,视图最终会立即重新绘制.
也许我没有NSOperation正确使用.我在"非并发"模式下使用它,但尽管名称我的理解是这仍然产生一个新线程并允许异步处理.
任何帮助或建议非常感谢,如果您想看到一些代码,请告诉我.
ger*_*ry3 10
响应于您的通知而执行的观察器中的方法未在主线程上执行.
因此,在该方法中,您可以强制使用另一种方法在主线程上运行performSelectorOnMainThread:withObject:waitUntilDone:.
例如:
MyOperation.m
- (void)main {
for (int i = 1; i <= 5; i++) {
sleep(1);
[[NSNotificationCenter defaultCenter] postNotificationName:@"GTCNotification" object:[NSNumber numberWithInteger:i]];
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)