1

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

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

在这种情况下,UI 没有锁定,但是进度条没有出现。我用

    [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];
}

请分享你的想法

4

2 回答 2

2

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

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

于 2012-07-24T06:25:56.047 回答
1

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

于 2012-07-24T06:22:43.763 回答