以下方法在非主线程上调用,具体来说,在录制音频队列回调中
- (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
已被多次调用。
答案 0 :(得分:1)
这里有一些可能性。
来自班级参考:
注意:如果您的视图由CAEAGLLayer对象支持,则此方法具有 没有效果。它仅适用于使用本机的视图 绘制技术(如UIKit和Core Graphics)来渲染它们 内容。
另一种选择,可能是这种情况下的原因,与实际的几何形状有关。如果提供的矩形无效或在屏幕外,则呼叫不执行任何操作。我建议你验证矩形是否正在计算中。
答案 1 :(得分:0)
感谢@ Neal的回答,这让我发现myGraphView
在第一次被分配后再次进行了分配。但是,与我在其superview中添加myGraphView
之后的第一个alloc-init不同,我忘了在第二个alloc-init之后这样做。
我在这里学到的教训是,当一个视图没有按照预期的方式进行操作时,例如没有显示或更新时,请始终检查第三种可能性,即忘记将其添加回超级视图后在代码中的某处再次使用alloc-inited。此外,如果视图有委托,您也会忘记设置它。