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替换并编辑了答案。