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

JYoung_Li 2015-11-16 02:16:28
求助各路前辈,各路大神
我现在做一个通讯录,我的思路是这样的,因为通讯录里面是分部门的,如"人事部",“研发部”等,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];
// });
}];

}
...全文
1010 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdjwanghong 2017-07-22
  • 打赏
  • 举报
回复
//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]; });
CJoneL 2015-11-20
  • 打赏
  • 举报
回复
block本来就是异步回调的操作,用在这里不合适,还不如直接把block要调用的代码复制过来
不担心 2015-11-17
  • 打赏
  • 举报
回复
i < deptList.count-1
试试

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧