最近项目中牵扯OC与H5交互, 其中有一个问题是H5加载相册的照片,方法大体是: 和后台制定好协议, 在请求中拦截这个协议, 之后传递一个相对地址给H5来加载本地图片.
交互时, H5调用OC注册的方法, 回调OC传递过来的照片的相对地址以便加载手机照片. 这里出现问题了, 要做到H5同步加载手机的图片,并不容易, 因为调用OC注册的方法时, 就要接着返回图片的相对地址, 来不及等用户操作, 就要返回地址. 所以要想办法执行完用户的操作, 得到相对路径之后再传递给H5, 这里就要先执行完用户的选取照片或拍摄照片的程序,拿到路径之后再去执行回调函数.
解决方法:
1 [_bridge registerHandler:@"addImage" handler:^(id data, WVJBResponseCallback responseCallback) { 2 3 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 4 _groupH5 = dispatch_group_create(); 5 6 dispatch_sync(queue,^{ 7 8 //保证线程顺序, 成功或失败都要离开group, dispatch_group_leave(_groupH5) 9 dispatch_group_enter(_groupH5); 10 11 // 加载照片 12 [self addImage]; 13 }); 14 15 //汇总 16 dispatch_group_notify(_groupH5, queue, ^{ 17 18 // 汇总结果, 这里再往H5传递地址参数时就不为空了 19 responseCallback(_imageSource); 20 }); 21 }];
代码如上所示, 方法就是加到一个组中, 进入组 dispatch_group_enter(_group), 执行完后(成功或失败都要离开)groupdispatch_group_leave(_group).
注意不要用异步, 经过测试, 异步调用相册的提示框时有10秒左右的延时!