我正在运行创建一个执行昂贵操作的iPhone应用程序,我想创建一个activityIndicator,让用户知道应用程序没有被冻结。
该操作完全在一个事件调用中执行...因此UI框架无法接收控件以实际显示并为该指示器设置动画。
使用UIActivityIndicator(或任何其他类似动画)的示例应用程序在不同的事件中启动和停止动画,在程序的不同阶段单独触发。
我是否需要手动创建一个单独的线程来运行我的操作,或者是否已经默认支持这种行为?
答案 0 :(得分:13)
我刚发现有人在苹果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
是我自己的方法:
答案 1 :(得分:9)
是的,当UIActivityIndicatorView调用保留在主线程上时,您需要将操作放在单独的线程中。
原因如下:如果您开始设置指标视图的动画,然后立即开始您的流程,您的流程将会阻止直到完成,用户将永远不会看到任何“活动”。
相反,开始设置指标动画,然后为您的流程弹出一个新线程。使用通知,委托模式或performSelectorOnMainThread:withObject:waitUntilDone:
让主线程知道该过程已完成。然后停止动画并继续。
这将确保用户在您的流程完成任务时知道正在发生的事情。
答案 2 :(得分:4)
如果你想做一些应该在主线程上开始的事情,开始一个新线程可能会过度使用并且是一个复杂的来源。
在我自己的代码中,我需要通过按下按钮来启动MailComposer,但它可能需要一些时间才能出现,我想确保UIActivityIndicator同时旋转。
这就是我的所作所为:
-(void)submit_Clicked:(id)event
{
[self.spinner startAnimating];
[self performSelector:@selector(displayComposerSheet)
withObject:nil afterDelay:0];
}
它将对displayComposerSheet进行排队,而不是立即执行它。足够让微调器开始制作动画!
答案 3 :(得分:-1)
UIProgressView(进度条)不能自行运行,需要定期增加其值。
UIActivityIndicatorView(旋转齿轮)可以单独运行:只需在开始操作时调用 startAnimating ,在完成后调用 stopAnimating 。
所以你可能正在寻找UIActivityIndicatorView。
答案 4 :(得分:-1)
哪个更容易:
1> Have 1 method that starts the spinner (in the background).
2> Run your long-running code right here.
3> Have 1 method that ends the spinner.
...或
A> Have 1 method that starts the spinner.
B> Have 20 methods (1 for each thing you want to do in the background)
C> Have 1 method that ends the spinner.
我总是看到每个人都建议A,B,C ...艰难的方式。