在iOs中的后台线程中调用函数

时间:2012-07-24 06:15:44

标签: iphone multithreading background-process dispatch uiprogressbar

在我的iPhone应用程序中,我有一个按钮,在按钮上单击我调用Web服务并获取一些链接,然后我需要下载这些链接中的文件。在按钮上单击一个弹出视图将出现并打开"确定"单击,该按钮将被替换为进度条,它将显示下载进度。下载完成后,进度条将再次被按钮取代。我在这里遇到的问题是,如果互联网连接速度很慢,用户界面将被阻止,并且"确定"按钮将保持按下模式,直到它完全从服务器获取详细信息,然后才会出现进度条。我想在单击“确定”按钮后立即显示进度条,它不应该锁定UI。我使用了以下方法:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
                                             (unsigned long)NULL), ^(void) {
        [self download];
    });

在这种情况下,用户界面没有锁定,但进度条没有来。我用了

    [self performSelectorInBackground:@selector(download) withObject:nil];

在这种情况下,UI没有阻止,但它显示下载按钮,直到它从服务器获取详细信息。只有这样才显示进度条。

下载的代码流程:

- (void)download{
   //Creating a custom progressview
    myprogressView = [[CustomProgressView alloc]initWithFrame:CGRectMake(25, 138, 100, 28)];
    [cell.contentView addSubview:myprogressView];
    [cell bringSubviewToFront:myprogressView];

    //Calling the methods for getting the details from the server

    //after some internal process, start download
    [self.myQueue go];
}

请分享您的想法

2 个答案:

答案 0 :(得分:2)

尽量不要在任何后台线程中更改UI。所有与UI相关的任务都应在主线程上执行..一旦数据进入,您就可以调用委托方法来更新UI ...

这里我可以看到你在后台线程中执行与UI相关的任务......原因是UIKit不是线程安全的......:/

答案 1 :(得分:1)

首先将按钮替换为进度视图。然后开始下载。我的意思是说,在按钮按下事件中更改UI然后调用您的[self.myQueue go];