我有一个使用核心情节的可可界面。当我在界面中按下一个按钮时,会绘制一个图。我想通过多次调用绘图方法以及在两者之间调用 sleep() 来创建一系列图形。但似乎即使调用了重新加载数据,在函数退出之前什么也没有发生(也只显示最后一个图表)。现在我知道 CPAnimation 存在,但在我开始使用它之前,我想知道当函数退出时会发生什么导致图形刷新。我是否必须屈服于负责刷新而不是使用睡眠的线程?
4 回答
好的,我想通了。我从一个单独的线程(总是返回)中的一个方法调用了 reloadData 方法。这归结为从 IBAction 和 NSTimer 调用 reloadData。最后,我将使用 NSConditionLock 来协调处理和刷新,而不是使用睡眠
据推测,Core Plot(或您的代码)将视图设置为需要显示。这不会立即发生。当您返回事件循环时会发生这种情况。
每当您sleep
在 Mac OS X 应用程序中使用时,您都会杀死一只小狗。请改用 NSTimer。让您的计时器回调方法完成一个图形所需的工作,并设置您的方法所需的任何实例变量以了解它应该绘制哪个图形,以便该方法依次绘制每个图形,直到用完它们。
或者,更好的是,呈现用户可以从中选择的图表列表,而不是让用户以幻灯片的形式观看所有图表。(除非您正在实施明确标记的幻灯片。)
像大多数 Cocoa 绘图框架一样,Core Plot 是惰性的:它在运行循环迭代结束时绘制。这是为了确保不会过于频繁地绘制事物。
不是立即绘制,而是将图层标记为需要绘制。
正如其他人所指出的,更好的睡眠方法是使用 NSTimer 来避免阻塞运行循环,或者使用 NSObject 方法,如 performSelector:withObject:afterDelay:
Peter 说得对——reload data 方法实际上并没有绘制任何东西。该图被标记为需要显示,并在下一次将图层绘制到屏幕时刷新。如果你使用sleep
,它永远没有机会绘制。
另请注意,Core Plot 是一个相当年轻的项目;CPAnimation
相关的类是存根。他们还没有真正做任何事情。:-)