我正在运行创建一个执行昂贵操作的iPhone应用程序,我想创建一个activityIndicator让用户知道应用程序没有被冻结.
该操作完全在一个事件调用中执行...因此UI框架没有机会接收控件以实际显示并为该指示器设置动画.
使用UIActivityIndicator(或任何其他类似动画)的示例应用程序在不同事件中启动和停止动画,在程序的不同阶段单独触发.
我是否需要手动创建一个单独的线程来运行我的操作,或者是否已经默认支持这种行为?
我刚发现有人在苹果iPhone论坛上提出了一个非常相似的问题. https://devforums.apple.com/message/24220#24220#注意:你必须有一个appleID来查看它.
基本上,是的,你需要开始在不同的线程中运行你的进程,但它很容易做到(从用户'eskimo1'转述)
- (IBAction)syncOnThreadAction:(id)sender { [self willStartJob]; id myObject = [MyObjectClass createNewObject]; [self performSelectorInBackground: @selector(inThreadStartDoJob:) withObject:myObject ]; } - (void)inThreadStartDoJob:(id)theJobToDo { NSAutoreleasePool * pool; NSString * status; pool = [[NSAutoreleasePool alloc] init]; assert(pool != nil); status = [theJobToDo countGrainsOfSandOnBeach]; [self performSelectorOnMainThread: @selector(didStopJobWithStatus:) withObject:status waitUntilDone:NO ]; [pool drain]; }
我在哪里-willStartJob
和-didStopJobWithStatus
我自己的方法:
禁用UI,以防止用户一次启动两个作业
设置活动指标
是的,当UIActivityIndicatorView调用保留在主线程上时,您需要将操作放在单独的线程中.
原因如下:如果您开始设置指标视图的动画,然后立即开始您的流程,您的流程将会阻止直到完成,用户将永远不会看到任何"活动".
相反,开始动画指标,然后为您的流程弹出一个新线程.使用通知,委托模式,或performSelectorOnMainThread:withObject:waitUntilDone:
让主线程知道该过程已完成.然后停止动画并继续.
这将确保用户在您的流程完成任务时知道正在发生的事情.