setNeedsDisplay在主队列上提交但未被调用

时间:2013-10-27 01:55:28

标签: ios objective-c multithreading setneedsdisplay dispatch-async

以下方法在非主线程上调用,具体来说,在录制音频队列回调中

- (void)myMethod
{
//...
dispatch_async(dispatch_get_main_queue(), ^{
    [myGraphView setNeedsDisplayInRect:CGRectMake(a, b, c, d)];
    NSLog(@"Block called");
});
//...
}

其中myGraphView是一个自定义的UIView对象。据我所知,setNeedsDisplayInRect:应该在主线程上调用,这就是我dispatch_async...到位的原因。现在的问题是我为myGraph实现的方法- (void)drawRect:(CGRect)rect从未被调用过,即使块中的NSLog已被多次调用。

2 个答案:

答案 0 :(得分:1)

这里有一些可能性。

来自班级参考:

  

注意:如果您的视图由CAEAGLLayer对象支持,则此方法具有   没有效果。它仅适用于使用本机的视图   绘制技术(如UIKit和Core Graphics)来渲染它们   内容。

另一种选择,可能是这种情况下的原因,与实际的几何形状有关。如果提供的矩形无效或在屏幕外,则呼叫不执行任何操作。我建议你验证矩形是否正在计算中。

答案 1 :(得分:0)

感谢@ Neal的回答,这让我发现myGraphView在第一次被分配后再次进行了分配。但是,与我在其superview中添加myGraphView之后的第一个alloc-init不同,我忘了在第二个alloc-init之后这样做。

我在这里学到的教训是,当一个视图没有按照预期的方式进行操作时,例如没有显示或更新时,请始终检查第三种可能性,即忘记将其添加回超级视图后在代码中的某处再次使用alloc-inited。此外,如果视图有委托,您也会忘记设置它。