代码之家  ›  专栏  ›  技术社区  ›  Akusete

UIActivityIndicator是否需要在iPhone上手动线程

  •  8
  • Akusete  · 技术社区  · 17 年前

    操作完全在一个事件调用中执行。。。因此,UI框架没有机会接收控制来实际显示和设置该指示器的动画。

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

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

    5 回复  |  直到 17 年前
        1
  •  13
  •   Akusete    15 年前

    我刚刚发现有人在苹果iPhone论坛上问了一个非常类似的问题,并给出了很好的答案。 https://devforums.apple.com/message/24220#24220 #注意:您必须有一个appleID才能查看它。

    - (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,以防止用户同时启动两个作业
    • 设置活动指示器
        2
  •  9
  •   August    17 年前

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

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

    这将确保在您的流程执行其操作时,用户知道正在发生的事情。

        3
  •  4
  •   Chris Markle    15 年前

    如果您想做一些应该从主线程开始的事情,那么启动一个新线程可能会造成过度杀伤力和复杂性。

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

    我就是这么做的:

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

        4
  •  -1
  •   Stephan Burlot    17 年前

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

    UIActivityIndicatorView(旋转装置)可以自行运行:只需调用 startAnimating 当你开始你的手术和 当你完成的时候。

    因此,UIActivityIndicator视图可能就是您要寻找的。

        5
  •  -1
  •   HelenJ    15 年前

    哪一个更容易:

    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。。。艰难的道路。