iPhone SDK:如何知道后台任务何时完成?

时间:2010-11-16 16:26:36

标签: iphone-sdk-3.0

我们正在努力让后台任务工作,以便在工作室屏幕中包含活动指示器。根据我们的理解,这需要创建一个后台线程来运行它。我也明白,不能在后台线程上执行GUI更新。

鉴于此,这是需要发生的事情的一般模式。

a。)预验证字段。确保用户未输入任何无效数据 b。)设置后台任务。 c。)后台任务的处理结果

到目前为止,这就是代码中的样子:

-(IBAction)launchtask:(id)sender 
{
    //validate fields
    [self validateFields];

    /* Operation Queue init (autorelease) */
    NSOperationQueue *queue = [NSOperationQueue new];

    /* Create our NSInvocationOperation to call loadDataWithOperation, passing in nil */
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                            selector:@selector(backgroundTask)
                                                                              object:nil];

    /* Add the operation to the queue */
    [queue addOperation:operation];
    [operation release];


    //TO DO: Add any post processing code here, BUT how do we know when it is done???
    ConfirmationViewController *otherVC;

    //show confirm
    //if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    //{
    //  otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationViewPad" bundle:nil];
    //}
    //else
    {
        otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationView" bundle:nil];
    }

    //TO DO: Let's put this in a struct
    otherVC.strConfirmation = strResponse;
    otherVC.strCardType = strCardType;
    otherVC.strCardNumber = txtCardNumber.text;
    otherVC.strExpires = txtExpires.text;
    otherVC.strCustomerEmail = txtEmail.text;

    [self.navigationController pushViewController:otherVC animated:YES];
    [otherVC release];
    otherVC = nil;  


}

到目前为止,除非我们还没有办法知道后台任务何时完成,否则它的效果非常好。只有完成后,我们才能处理后台任务的结果。现在,它不起作用,因为两者没有同步。怎么解决?

另外一件事,注意到现在状态栏中显示了微调器。这是一件好事,但在后台任务完成后似乎没有消失?怎么办?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的选择是:

  • 键值观察NSOperationQueue上的'operationCount'属性并等待它达到0(或等效地,'operations'属性并检查计数)
  • 让你的操作发出一些通知,说明他们已经完成了(可能在主线程上使用performSelectorOnMainThread:...)并等到收到正确数量的通知。

[编辑:我看到你已经具体询问了旧的SDK 3.0。在这种情况下,请观察操作和检查计数,因为operationCount属性是后期SDK 3.0]

在一般情况下,没有用于启动和停止微调器的自动系统。你必须自己说话。然而,关于微调器的一个巧妙的事情就是即使主线程被阻塞它也会继续旋转,所以如果你只是为了这个目的而跳线,那么你实际上并不需要。

我相信状态栏中会出现一个微调器来显示数据提取。如果它继续旋转,那么你仍然有URL请求正在进行,无论你是否真的在等待结果。