for循环里,先执行完block代码再执行下一次循环.

新手上路,请多包涵

求助各路前辈,各路大神
我现在做一个通讯录,我的思路是这样的,因为通讯录里面是分部门的,如"人事部",“研发部”等,depList这个数组存的就是参数,key就是参数。例如:每次把“人事部”传入这个参数,进行请求,回调函数就会返回“人事部”的成员的数据,如此类推,每次需要传入不同部门的参数,我把每个部门的数据返回来,添加到可变数组“save1”里面,然后最后写入plist文件。用tableview展示的时候再读取plist来展示。
我现在遇到的问题是,经过多次循环后,得到了重复的数据,例如得到了两组“人事部的数据”,我想应该是回调的时候,线程那里出问题了。

求前辈们指点。

save1 = [NSMutableArray array];
//    __block int k = 0;
    for ( int i = 0; i < deptList.count; i++) {
        __block NSString *key = deptList.allKeys[i];
        NSLog(@"key%@",key);
            [RMIUserManager getContacts:key callBack:^(NSDictionary *resultDic) {
//                dispatch_async(dispatch_get_main_queue(), ^{
                    [save1 addObject:[resultDic objectForKey:@"contactInfo"]];
                    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
                    // 拼接文件路径
                    NSString *path = [doc stringByAppendingPathComponent:@"contacts.plist"];
                    [save1 writeToFile:path atomically:YES];
//                        });
            }];
        
    }
阅读 4.9k
1 个回答
新手上路,请多包涵

//01>>全局变量group

            dispatch_group_t group = dispatch_group_create();
            
            //循环读取用户数据
            for (Department *department in resultArr) {
                //02>>进入组(进入组和离开组必须成对出现, 否则会造成死锁)
                dispatch_group_enter(group);
                [userApi get_u_all_by_dep_id:u_id access_token:access_token dep_id:department.id Succeed:^(User_utd *resultModel) {
                    
                    User_utd *user_utd=resultModel;
                    [db createTableAndIndexesOfName:NSStringFromClass(Simple_user.class) withClass:Simple_user.class];
                    [db insertOrReplaceObjects:user_utd.user into:NSStringFromClass(Simple_user.class)];
                    
                    [db createTableAndIndexesOfName:NSStringFromClass(User_to_dep.class) withClass:User_to_dep.class];
                    [db insertOrReplaceObjects:user_utd.utd into:NSStringFromClass(User_to_dep.class)];
                    
                    //03>>进入组(进入组和离开组必须成对出现, 否则会造成死锁)
                    dispatch_group_leave(group);
                    
                    
                } failure:^(NSError *error) {
                    
                }];
            }
            //04>>当执行for循环的时候,一次次执行异步任务下载数据,只有当这两个异步任务都执行完毕了才会执行dispatch_grout_notify方法。
            dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                //读取完数据之后,再将部门,用户,标记插入。
                [self insertDepartment:resultArr andUtd_mark:arrayUtd_mark intoconnectionArr:connectionArr db:db];
                refreshArchive.d=refreshDB.d;
                [archiveTools saveRefresh:refreshArchive];
            });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进