我试图找到避免在我的应用中的某些事件后出现微小的UI锁定的最佳方法。例如,这里有两种情况,我遇到了迷你锁定:
我有一个按钮,当按下时,使用AVAudioPlayer加载本地mp3文件(大约20-30mb),调用prepareToPlay方法,然后播放音频文件。问题是该按钮将showsTouchWhenHighlighted标志设置为是,按下后它会一直保持高亮显示,直到音频文件开始播放,这可能需要1-3秒。
另一个类似的例子是使用导航栏按钮对表数据进行排序和重新加载。有一个非常短但明显的锁定,其中按钮保持突出显示,直到表重新加载。
有人能建议一种最好的方法来减少/消除这些迷你锁定吗?我没有真正遇到任何代码来实现这一点,我读过的任何书籍/教程都涉及tableviews和avaudioplayer。我应该在不同的线程上启动这些操作吗?
THX
答案 0 :(得分:2)
对于数字1,您最好的选择是在后台线程上加载项目并通知用户您正在这样做(通过加载HUD或其他指示器)。最简单的方法是使用- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;
。如果您正在运行iOS 4.0 +,您可能需要查看执行块回调并查看它们是否适合您。
对于数字2,在后台线程上执行排序或更改排序方法(考虑使用排序数据结构而不是在插入后求助?)。 reloadData应仅在主线程上发生。
答案 1 :(得分:1)
我自己就是一个iPhone noob,但听起来你的代码卡在做同步动作,这将保证你的UI被锁定,直到动作执行完毕。
虽然我没有明确的答案,但请查找异步选项以执行这些操作,因为它们不会锁定您的UI。这些通常通过使用线程或延迟对象来实现。根据我迄今为止使用Objective-C的经验,您的程序需要采取的大多数操作都可以通过异步操作来实现。