UIActivityIndi​​cator是否需要在iPhone上进行手动线程处理

时间:2009-01-13 23:37:44

标签: iphone cocoa-touch multithreading

我正在运行创建一个执行昂贵操作的iPhone应用程序,我想创建一个activityIndi​​cator,让用户知道应用程序没有被冻结。

该操作完全在一个事件调用中执行...因此UI框架无法接收控件以实际显示并为该指示器设置动画。

使用UIActivityIndi​​cator(或任何其他类似动画)的示例应用程序在不同的事件中启动和停止动画,在程序的不同阶段单独触发。

我是否需要手动创建一个单独的线程来运行我的操作,或者是否已经默认支持这种行为?

5 个答案:

答案 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)

是的,当UIActivityIndi​​catorView调用保留在主线程上时,您需要将操作放在单独的线程中。

原因如下:如果您开始设置指标视图的动画,然后立即开始您的流程,您的流程将会阻止直到完成,用户将永远不会看到任何“活动”。

相反,开始设置指标动画,然后为您的流程弹出一个新线程。使用通知,委托模式或performSelectorOnMainThread:withObject:waitUntilDone:让主线程知道该过程已完成。然后停止动画并继续。

这将确保用户在您的流程完成任务时知道正在发生的事情。

答案 2 :(得分:4)

如果你想做一些应该在主线程上开始的事情,开始一个新线程可能会过度使用并且是一个复杂的来源。

在我自己的代码中,我需要通过按下按钮来启动MailComposer,但它可能需要一些时间才能出现,我想确保UIActivityIndi​​cator同时旋转。

这就是我的所作所为:

-(void)submit_Clicked:(id)event
{
    [self.spinner startAnimating];
    [self performSelector:@selector(displayComposerSheet) 
               withObject:nil afterDelay:0];    
}

它将对displayComposerSheet进行排队,而不是立即执行它。足够让微调器开始制作动画!

答案 3 :(得分:-1)

UIProgressView(进度条)不能自行运行,需要定期增加其值。

UIActivityIndi​​catorView(旋转齿轮)可以单独运行:只需在开始操作时调用 startAnimating ,在完成后调用 stopAnimating

所以你可能正在寻找UIActivityIndi​​catorView。

答案 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 ...艰难的方式。