绘制后台修改的数组内容

Draw the contents of an array modified in the background

我有一个后台线程,它 运行 修改对象中 NSMutableArray 的内容。这需要很长时间才能达到 运行(几个小时),我会定期在 NSViewdrawRect 中绘制数组的内容,以检查进度并查看中间结果。

我的对象有一个带有方法的协议: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 来锁定 startdrawInContext 方法的外循环。我仍然不确定这是否是最好的方法,几天内不会接受这个答案,以防有更好的答案。

- (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];
}