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后台线程中的函数调用的主要内容,如果未能解决你的问题,请参考以下文章

iOS:在多个后台线程完成之前不要从函数返回

Java中的非阻塞异步IO

在iOS中的后台任务中调用Javascript函数

iOS:主线程检查器:在后台线程上调用的 UI API:-[UIView retainCount]

C++如何运行多个可以随时调用的后台函数线程?

在后台和主线程 ios 中执行