绘制在后台修改的数组的内容

时间:2015-05-06 06:36:08

标签: objective-c background-process osx-yosemite drawrect

我有一个后台线程,它运行并修改对象中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]; } 在绘图发生时被更改。我该怎么做?在进行更新时,我是否以某种方式暂停后台线程中的处理?

编辑:这是我正在绘制的那种显示(尽管要复杂得多):

enter image description here

任何帮助表示感谢。

2 个答案:

答案 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来锁定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];
}