刷新视图,显示和setNeedsDisplay无法正常工作

时间:2010-11-11 14:14:55

标签: objective-c xcode macos

我在模拟期间更新我的customView对象时遇到问题。模拟完成后,窗口会弹出。我希望它在模拟过程中自我更新。为此,我使用setNeedsDisplay:YES,我也尝试了display。然而,这对我来说都不适用。有谁知道我应该如何使这个工作?正如您在下面看到的,我尝试为更新创建一个新线程以及使用NSOperations。感谢帮助!

//Run simulation
    for (int iteration=0; iteration<numberOfIterations; iteration++){
        //NSInvocationOperation *update = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updatePopulation) object:nil];
        //NSInvocationOperation *draw = [[NSInvocationOperation alloc] initWithTarget:view selector:@selector(redraw) object:nil];
        //[draw addDependency:update];
        //[queue addOperation:update];
        //[queue addOperation:draw];
        [NSThread sleepForTimeInterval:0.01]; //to make it easer to see..
        [self updatePopulation];
        //[view redraw];
        [NSThread detachNewThreadSelector:@selector(redraw) toTarget:view withObject:nil];
        //[self performSelector:@selector(updatePopulation) withObject:nil afterDelay:1];
        //[view performSelector:@selector(redraw) withObject:nil afterDelay:1];
        //Save segregation
        if (iteration%(numberOfIterations/100) == 0) {
            printf("hej\n");
        }
    }

在我的观众班中:

- (void) redraw {
    //[self setNeedsDisplay:YES];
    [self display];
}

1 个答案:

答案 0 :(得分:3)

看起来你正试图在工作线程上进行绘画。

据我所知,这不是支持的。

要解决此问题,您需要将模拟移动到工作线程,然后使用performSelectorOnMainThread:调用主线程上的重绘。在尝试实现线程化可可应用程序时,我发现需要阅读this article on threading in cocoa