同步网络操作的价值

在iOS开发中, 苹果已经将同步网络操作给干掉了, 它给的理由是开发者们不懂事, 用不好同步操作, 所以, 它老人家只给异步操作, 以免各位不懂事的开发者给弄错了. 但是, 从个人来说, 同步操作, 其实仍然是有其价值的, 那就是在逻辑设计上会变得简单. 

我举个例子, 比如在不引入三方库的情况下, 我们要做到类似于SDWebImage的使用URL加载远程图片到UIImageView, 那么, 这个工作是非常复杂的. 

大致的做法是(不考虑任何异常和错误的处理):

extension UIImageView {
    func asyncSetImageBy(url:URL) {
        URLSession.shared.dataTask(with: url) { [weak self] (data, _, _) in
            if let data = data {
                self?.image = UIImage(data: data)
            }
        }.resume()
    }
}

 

如果改成使用同步方法, 同时要保持不影响主线程操作, 那就是:

extension UIImageView {
	func syncSetImageBy(url:URL) {
		OperationQueue().addOperation { [weak self] in
			guard let iview = self else { return }
			if let data = try? Data(contentsOf: url) {
				let image = UIImage(data: data)
				
				OperationQueue.main.addOperation { [weak iview, weak image] in
					iview?.image = image
				}
			}
		}
	}
}

 

简单一看, 后者复杂得多, 所以苹果的思路还是对的, 直接强迫开发者使用异步方法. 但是, 如果我将思路变一下, 比如, 这里要设置多张图片, 作为animated images的话, 那么, 工作就变了. 前者要引入各种线程等待的方式, 保证网络数据的完整性, 逻辑上变得非常复杂. 但是, 后者呢, 代码量几乎不用变. 

extension UIImageView {
	func syncSetAnimatedImagesBy(urls:[URL]) {
		OperationQueue().addOperation { [weak self] in
			guard let iview = self else { return }
			let images = urls.flatMap({try? Data(contentsOf:$0)}).flatMap({UIImage(data:$0)})
			
			OperationQueue.main.addOperation { [weak iview, images] in
				iview?.animationImages = images
			}
		}
	}
}

 

这就是同步的好处, 逻辑上变得非常直观, 希望对你有所帮助. 

转载于:https://my.oschina.net/wyo/blog/838728

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值