亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

使用GCD中的dispatch_semaphore(信號量)處理一個界面多個請求(把握AFNet網絡請求完成的正確時機)

標簽:
iOS

对于iOS开发中的网络请求模块,AFNetworking的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?什么是信号量?

1.先说什么是信号量。

信号量:就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可告知系统按照我们指定的信号量数量来执行多个线程。其实,这有点类似锁机制了,只不过信号量都是系统帮助我们处理了,我们只需要在执行线程之前,设定一个信号量值,并且在使用时,加上信号量处理方法就行了。

信号量有3个函数,分别是:

创建信号量,参数:信号量的初值 

dispatch_semaphore_create(信号量值)

等待降低信号量  dispatch_semaphore_wait(信号量,等待时间)

提高信号量 dispatch_semaphore_signal(信号量)

2.在真实开发中,我们通常会遇到如下问题:

①一个界面存在多个请求,希望所有请求完成之后才去进行下面的操作。

解决方案很容易想到通过线程组进行实现。代码如下:


5bd952c30001c99c12400394.jpg

打印结果如下:

5bd952c400014f9307560210.jpg

打印结果观察可能并没有什么问题,但需要注意的是request1 request2 request3等在真实开发中通常对应为某个网络请求。而网络请求通常为异步,那这时是否还会有同样结果呢?

我们换成真是的网络请求再看一下。

对于App请求数据大部分人都会选择AFNetworking。使用AFN异步请求,请求的数据返回后,就刷新相关UI。如果某一个页面有多个网络请求,我们假设有三个请求,request1、request2、request3,而且UI里的数据必须等到request1、request2、request3全部完成后刷新后才显示。

这里我们书写一个网络请求通用方法。使用我们最常用的AFNet请求,方法如下:


5bd952c500018ae812400408.jpg

request2 request3分别请求对应的下面的数据,就不重复写了,文章末尾会把demo地址附上,感兴趣的可以下载来看一下。

打印结果如下:


5bd952c50001521005021032.jpg

运行后马上接收到了线程组完成的提示,之后数据才依次请求下来,很明显三个单纯的AFNetworking请求已经不能满足我们的需求了。线程组完成时并没有在我们希望的时候给予通知。在真实开发中会造成的问题为多个请求均加载完成,但界面已在未得到数据前提前刷新导致界面空白。

这里我们就要借助GCD中的信号量dispatch_semaphore进行实现,即营造线程同步情况。

dispatch_semaphore信号量为基于计数器的一种多线程同步机制。用于解决在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。

如果semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数为0,则等待。

dispatch_semaphore_signal(semaphore)为计数+1操作。dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)为设置等待时间,这里设置的等待时间是一直等待。

把网络请求进行如下修改:


5bd952c60001c32312400572.jpg

5bd952c70001c1e302801010.jpg

通过信号量dispatch_semaphore完美的解决了此问题,并且网络请求仍为异步,不会堵塞当前主线程。

实例地址:点击去下载


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消