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

Aku*_*ete 8 iphone multithreading cocoa-touch

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

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

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

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

Aku*_*ete 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];
}
Run Code Online (Sandbox Code Playgroud)

我在哪里-willStartJob-didStopJobWithStatus我自己的方法:

  • 禁用UI,以防止用户一次启动两个作业
  • 设置活动指标


Aug*_*ust 9

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

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

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

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