IOS开发中异步网络请求上实现同步逻辑

发布时间 - 2026-01-11 00:15:36    点击率:

IOS开发中异步网络请求上实现同步逻辑

前提:

可能遇到一些问题,比如上传多个数据,需要等多个数据上传成功后做一定的处理,而且一个个上传,万一哪个上传失败了,后面就不需要上传了,直接报错。

之前ASI的网络库中是有同步请求的接口,所以很好处理,AFNetwork的网络库只有异步的网络请求,该怎么实现呢?

1.循环异步拼组

- (void)uploadFile:(NSArray *)imageArray atIndex:(NSInteger)index imagesCount:(NSInteger)count completeBlock:(uploadCompleteBlock)block {
 FNCircleImage *aTCImage = imageArray[index];
 NSString *filepath = aTCImage.localFilePath;
 [self.resourceManager upload:filepath progress:nil completion:^(NSString * _Nullable urlString, NSError * _Nullable error) {
  if (error == nil) {
   aTCImage.remoteUrl = urlString;

   NSInteger idx = index + 1;
   if (idx >= count) {
    block(nil);
   } else {
    [self uploadFile:imageArray atIndex:idx imagesCount:count completeBlock:block];
   }
  } else {
   block(error);
  }
 }];
}

2.信号量异步转同步

__block NSError *e = nil;
[imageArray enumerateObjectsUsingBlock:^(NSString *filePath, NSUInteger idx, BOOL * _Nonnull stop) {
 __block dispatch_semaphore_t t = dispatch_semaphore_create(0);
 [self upload:filepath progress:nil completion:^(NSString * _Nullable urlString, NSError * _Nullable error) {
  if (error == nil) {
   
  } else {
   e = error;
   *stop = YES;
  }
  dispatch_semaphore_signal(t);
 }];
 dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);
}];

3.NSOperationQueue可控队列

1).继承NSOperation实现上传逻辑,完成发出通知或者block回调

2).用上传数据创建Operation数组,加入NSOperationQueue中执行

3).根据完成回调的结果和个数判断结果,如果中间有失败,可以关闭未执行的Operation

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS实现同步逻辑  # IOS异步网络请求  # iOS利用AVPlayer播放网络音乐的方法教程  # 详解iOS中多个网络请求的同步问题总结  # Vue.js教程之axios与网络传输的学习实践  # iOS中设置网络超时时间+模拟的方法详解  # iOS socket网络编程实例详解  # IOS 出现问题POST网络请求状态code:500的解决方法  # iOS判断网络请求超时的方法  # IOS 网络请求中设置cookie  # 上传  # 多个  # 回调  # 信号量  # 很好  # 是有  # 就不  # 希望能  # 报错  # 该怎么  # 谢谢大家  # 传了  # 库中  # 失败了  # index  # atIndex  # NSInteger  # NSArray  # imageArray  # uploadCompleteBlock 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  实例解析angularjs的filter过滤器  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Android Socket接口实现即时通讯实例代码  微信小程序 canvas开发实例及注意事项  如何快速启动建站代理加盟业务?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  如何在阿里云高效完成企业建站全流程?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Python文本处理实践_日志清洗解析【指导】  如何快速查询网址的建站时间与历史轨迹?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  EditPlus中的正则表达式 实战(1)  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  在线制作视频的网站有哪些,电脑如何制作视频短片?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  用yum安装MySQLdb模块的步骤方法  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  黑客如何利用漏洞与弱口令入侵网站服务器?  如何解决hover在ie6中的兼容性问题  网站制作大概多少钱一个,做一个平台网站大概多少钱?  微信公众帐号开发教程之图文消息全攻略  iOS中将个别页面强制横屏其他页面竖屏  Android okhttputils现在进度显示实例代码  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  如何在阿里云虚拟主机上快速搭建个人网站?  音乐网站服务器如何优化API响应速度?  如何在腾讯云服务器上快速搭建个人网站?  大连 网站制作,大连天途有线官网?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  如何快速搭建支持数据库操作的智能建站平台?  如何选择PHP开源工具快速搭建网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  移动端脚本框架Hammer.js  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  网站图片在线制作软件,怎么在图片上做链接?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何基于PHP生成高效IDC网络公司建站源码?  canvas 画布在主流浏览器中的尺寸限制详细介绍  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】