在我的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];
}
请分享您的想法
答案 0 :(得分:2)
尽量不要在任何后台线程中更改UI。所有与UI相关的任务都应在主线程上执行..一旦数据进入,您就可以调用委托方法来更新UI ...
这里我可以看到你在后台线程中执行与UI相关的任务......原因是UIKit不是线程安全的......:/
答案 1 :(得分:1)
首先将按钮替换为进度视图。然后开始下载。我的意思是说,在按钮按下事件中更改UI然后调用您的[self.myQueue go];