Objective c 绘制在背景中修改的数组的内容

Objective c 绘制在背景中修改的数组的内容,objective-c,background-process,osx-yosemite,drawrect,Objective C,Background Process,Osx Yosemite,Drawrect,我有一个后台线程,它运行并修改对象中NSMutableArray的内容。这需要很长时间才能运行(几个小时),我定期希望在NSView的drawRect中绘制数组的内容,以检查进度并查看中间结果 我的对象有一个协议,其方法名为:didChange: // How I start my background thread [self performSelectorInBackground:@selector(startProcessing) withObject:nil]; - (void)sta

我有一个后台线程,它运行并修改对象中
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];
}
-(无效)开始{
对于(int i=0;i
如果是数组,那么使用tableview听起来是正确的选择。我正在绘制一个带有连接的节点矩阵。所以我需要画出它所代表的,而不仅仅是显示一个列表。我会添加一张图片,让你知道我在画什么。数组有多大?当请求不可变副本以避免变异问题时,您能否返回该副本?您是否尝试过使数组原子化?这样,您将在另一个线程更改数组中的某些内容之前或之后获得该数组,但它肯定是一个可以使用的对象@bbum对此有一个很好的解释:这并没有回答问题。您似乎没有使用条件锁的“条件”部分。因此,您可以使用
NSLock
。还有其他同步原语,如
@synchronized
或串行调度队列
@synchronized
对于这个特定的用例来说可能是最简单、最不容易出错、最有效的。谢谢Ken,用NSLock替换并编辑了答案。