0

下面的方法是在非主线程上调用的,具体来说是在录音队列回调中

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

其中 myGraphView 是一个自定义 UIView 对象。据我所知,setNeedsDisplayInRect:应该在主线程上调用,这就是我准备dispatch_async...就绪的原因。现在的问题是- (void)drawRect:(CGRect)rect我为 myGraph 实现的方法永远不会被调用,即使NSLog块中的 已经被调用了很多次。

4

2 回答 2

1

这里有几种可能性。

从类参考:

注意:如果您的视图由 CAEAGLLayer 对象支持,则此方法无效。它仅适用于使用原生绘图技术(如 UIKit 和 Core Graphics)来呈现其内容的视图。

另一个选项,这可能是这种情况下的原因,与实际几何形状有关。如果提供的矩形无效或不在屏幕上,则调用不执行任何操作。我建议您验证矩形是否按应有的方式计算。

于 2013-10-27T03:04:06.233 回答
0

感谢@Neal 的回答让我发现myGraphView,在它第一次被分配初始化之后,再次被分配。然而,与第一个 alloc-init 之后我添加myGraphView到它的 superview 不同,我在第二个 alloc-init 之后忘记了这样做。

我在这里学到的教训是,当视图没有按预期执行时,例如未显示或更新,请始终检查第三种可能性,即在分配初始化后忘记将其添加回其父视图再次在您的代码中的某个地方。此外,如果视图有一个委托,您也往往会忘记设置它。

于 2013-10-28T17:13:46.593 回答