iOs后台线程中的函数调用
Posted
技术标签:
【中文标题】iOs后台线程中的函数调用【英文标题】:Function call in background thread in iOs 【发布时间】:2012-07-24 06:15:44 【问题描述】:在我的 iPhone 应用程序中,我有一个按钮,单击该按钮我调用 Web 服务并获取一些链接,然后我需要下载这些链接中的文件。单击按钮会弹出一个视图,单击“确定”按钮将替换为进度条,并显示下载进度。下载完成后,进度条将再次被按钮替换。我在这里遇到的问题是,如果互联网连接速度很慢,UI 将被阻止,并且“确定”按钮将保持按下模式,直到它完全从服务器获取详细信息,然后才会出现进度条。我想在单击确定按钮后立即显示进度条,它不应该锁定 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];
请分享你的想法
【问题讨论】:
【参考方案1】:尽量不要在任何后台线程中更改 UI。所有与 UI 相关的任务都应在主线程上执行。您可以调用委托方法来更新 UI 数据一进来...
在这里我可以看到您正在后台线程中执行与 UI 相关的任务...原因是 UIKit 不是线程安全的...:/
【讨论】:
【参考方案2】:首先将您的按钮替换为进度视图。然后开始下载。我的意思是说,在按钮按下事件中更改 UI 然后调用你的[self.myQueue go];
【讨论】:
这就是我现在正在做的对吧?它正在工作。但在正常情况下需要时间。但是我在问题中提到了一些问题。我应该做哪些改变?有什么想法吗? 我的意思是单独做 UI。没有在下载功能中。以上是关于iOs后台线程中的函数调用的主要内容,如果未能解决你的问题,请参考以下文章