我有一个包含三个异步方法的for循环,我希望在这3个异步方法完成后进行一些处理.
-(void)getAllUsersinformations{
dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
           for(User *user in users){
              [self getUserInfo:user];
           }
      //Here,I want to reload the table view for example,after finishing the for loop (executing the whole three methods).
    });
}

-(void)getUserInfo:(User*)user{
     [self getinformations:user];
     [self getExperiences:user];
     [self getEducation:user];
}

你有任何技术可以得到这个结果吗?
非常感谢你.

解决方法

一种GCD方法是使用dispatch_group.因此,在启动异步任务之前,调用dispatch_group_enter,然后在异步任务完成时调用dispatch_group_leave,然后可以创建dispatch_group_notify,当异步任务完成时将调用它.您可以将此与完成块模式结合(无论如何,这对于异步方法都是一个好主意):

>如果getinformations,getExperiences和getEducation本身就是所有异步方法,那么首先需要的是一些机制来了解它们何时完成.一种常见的解决方案是为每个实现完成块模式.例如:

// added completionHandler parameter which will be called when the retrieval
// of the "informations" is done.

- (void)getinformations:(User*)user completionHandler:(void (^)(void))completionHandler {
    // do whatever you were before,but in the asynchronous task's completion block,call this
    // completionHandler()
    //
    // for example

    NSURLRequest *request;

    [NSURLConnection sendAsynchronousRequest:request queue:nil completionHandler:^(NSURLResponse *response,NSData *data,NSError *connectionError) {
        // handle the request here

        // the important thing is that the completion handler should
        // be called _inside_ the this block

        if (completionHandler) {
            completionHandler();
        }
    }];
}

对getExperiences和getEducation也重复这个过程.
>然后,您可以使用调度组通知您完成这三个请求中的每个请求的时间,并在发生时调用getUserInfo中的完成块:

// added completion handler that will be called only when `getinformations`,// `getExperiences` and `getEducation` are all done.
//
// this takes advantage of the completion block we added to those three
// methods above

- (void)getUserInfo:(User*)user completionHandler:(void (^)(void))completionHandler {
    dispatch_group_t group = dispatch_group_create();

    // start the three requests

    dispatch_group_enter(group);
    [self getinformations:user completionHandler:^{
        dispatch_group_leave(group);
    }];

    dispatch_group_enter(group);
    [self getExperiences:user completionHandler:^{
        dispatch_group_leave(group);
    }];

    dispatch_group_enter(group);
    [self getEducation:user completionHandler:^{
        dispatch_group_leave(group);
    }];

    // this block will be called asynchronously only when the above three are done

    dispatch_group_notify(group,dispatch_get_main_queue(),^{
        if (completionHandler) {
            completionHandler();
        }
    });
}

>然后你在getAllUsersinformations重复这个过程:

// call new getUserInfo,using dispatch group to keep track of whether
// all the requests are done

-(void)getAllUsersinformations {

    dispatch_group_t group = dispatch_group_create();

    for(User *user in users){
        dispatch_group_enter(group);

        [self getUserInfo:user completionHandler:^{
            dispatch_group_leave(group);
        }];
    }

    dispatch_group_notify(group,^{
        [self.tableView reloadData];
    });
}

两个最后的想法:

>概述了所有这些,我必须承认我可能会将这些请求包装在并发/异步自定义NSOperation子类中,而不是使用调度组.请参阅Concurrency Programming Guide的“配置并发执行操作”部分.这是对代码进行更彻底的重构,因此我不会在此处解决此问题,但它允许您限制将同时运行的这些请求的数量,从而降低潜力超时问题.>我不知道有多少用户请求正在进行,但您可能需要考虑在用户信息进入时更新UI,而不是等待所有内容完成.这又是对代码进行更彻底的重构,但可能会导致更具响应性的内容.

ios – 等待异步方法在for循环中完成的更多相关文章

  1. ios – 等待异步方法在for循环中完成

    我有一个包含三个异步方法的for循环,我希望在这3个异步方法完成后进行一些处理.你有任何技术可以得到这个结果吗?

  2. Swift语法基础:17 - Swift的For循环, While, Do-While, If, Switch

    在Swift中,也有控制流,分别是For,For-In,For条件递增,While,Do-While等等,让我们一起来探讨一下:1.For循环在Swift中提供两种循环,一种是For-In,另一种是For条件递增,先来看第一种:如果你不需要知道范围内每一项的值,你可以使用下划线(_)替代变量名来忽略对值的访问:在前面数组和字典的遍历就已经举过例子了,所以这里就不再列举了.2.For条件递增在Swi

  3. Swift for 的几个例子

  4. [anyObject] 类型推断 Type Casting

    在swift中,如果遍历一个集合,可能就需要用到类型推断方式二:适合多种类型的混合,在for循环里,如果是多种类型,就进行多种类型的判断添加if-else

  5. 【swift】15-0521 控制流---for,while,do-while

    for-in循环for被乘数in1…5{println}let底=3let幂=10var结果=1for_in1…幂{结果*=底}println在数组与字典中循环打印出其中所有元素。)}elseif{println(“很遗憾遇到蛇,后退(-前进步数)!”)do-while循环—先执行一次循环体再判断

  6. Swift - Swift数组迭代

    依据不同情形,swift提供很多种方式对数组进行迭代比如有如下数组:1.通过变量递增的for循环2.使用Range操作符3.使用enumerate进行枚举

  7. swift 基础笔记七for循环

  8. Swift教程之循环语句

  9. Swift在for循环中报错'++' is not a binary operator

    是在写for循环的时候出现语法错误。点击前往文档地址其中有一段话介绍了运算符的前缀、后缀特性,摘录如下:Thewhitespacearoundanoperatorisusedtodeterminewhetheranoperatorisusedasaprefixoperator,apostfixoperator,orabinaryoperator.Thisbehaviorissummarizedinthefollowingrules:Ifanoperatorhaswhitespacearoundbothsi

  10. Swift - 流程控制

    switch分支语句switch语句由一个控制表达式和多个case标签组成。不存在隐式贯穿与C语言和Objective-C中的switch语句不同,在Swift中,当匹配的case分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个case分支。For循环Swift提供两种for循环形式以来按照指定的次数多次执行一系列语句:for-in循环对一个集合里面的每个元素执行一系列语句。Swift有四种控制转移语句:continue、break、fallthrough、return、throw

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部