绘制后台修改的数组内容
Draw the contents of an array modified in the background
我有一个后台线程,它 运行 修改对象中 NSMutableArray
的内容。这需要很长时间才能达到 运行(几个小时),我会定期在 NSView
的 drawRect
中绘制数组的内容,以检查进度并查看中间结果。
我的对象有一个带有方法的协议: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];
}
一切正常,除了 NSMutableArray
支持所有这一切在绘图发生时被更改。我应该怎么做?在进行更新时,我是否以某种方式暂停了后台线程中的处理?
编辑: 这是我正在绘制的那种显示(尽管要复杂得多):
感谢任何帮助。
如果你在后台线程中做某事并且你想更新 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
});
}
我使用 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];
}
我有一个后台线程,它 运行 修改对象中 NSMutableArray
的内容。这需要很长时间才能达到 运行(几个小时),我会定期在 NSView
的 drawRect
中绘制数组的内容,以检查进度并查看中间结果。
我的对象有一个带有方法的协议: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];
}
一切正常,除了 NSMutableArray
支持所有这一切在绘图发生时被更改。我应该怎么做?在进行更新时,我是否以某种方式暂停了后台线程中的处理?
编辑: 这是我正在绘制的那种显示(尽管要复杂得多):
感谢任何帮助。
如果你在后台线程中做某事并且你想更新 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
});
}
我使用 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];
}