我有一个后台线程,它运行并修改对象中NSMutableArray
的内容。这需要很长时间才能运行(几个小时),我会定期在drawRect
的{{1}}内绘制数组的内容,以检查进度并查看中间结果。
我的对象有一个协议,其方法名为:NSView
:
didChange
所有工作,除了支持所有这一切的// How I start my background thread
[self performSelectorInBackground:@selector(startProcessing) withObject:nil];
- (void)startProcessing {
myObject.delegate = self;
[myObject start];
}
// My protocol implementation
- (void)myObjectDidChange:(myObjectClass *)sender {
[myView setNeedsDisplay:YES];
}
// My View's drawRect (pseudo code)
- (void)drawRect {
[myObject drawInContext:context];
}
在绘图发生时被更改。我该怎么做?在进行更新时,我是否以某种方式暂停后台线程中的处理?
编辑:这是我正在绘制的那种显示(尽管要复杂得多):
任何帮助表示感谢。
答案 0 :(得分:0)
如果你在后台线程中做某些事情并且想要更新UI,它通常在主线程上完成,所以在你的对象确实改变了你会这样做,可能是这样的:
// My protocol implementation
- (void)myObjectDidChange:(myObjectClass *)sender {
dispatch_async(dispatch_get_main_queue(), ^{
[self drawRect]; //Or any drawing function you are trying to do
});
}
答案 1 :(得分:0)
我使用NSLock
来锁定start
和drawInContext
方法的外循环。我仍然不确定这是否是最好的方法,如果有更好的答案,我会在几天内不接受这个答案。
- (void)start {
for(int i=0; i < MAX; i++) {
[self.updateLock lock];
....
[self.updateLock unlock];
}
}
- (void)drawInContext:(CGContextRef)context {
[self.updateLock lock];
...
[self.updateLock unlock];
}