您的位置:首页 > 移动开发 > IOS开发

让人头疼的ios 8——GCDAsynSoc…

2016-02-19 09:29 465 查看
众所周知,socket通信有一个缓冲区,正常情况下,异步的socket是不会有socket的阻塞问题发生的,可是这个ios8
却会。因为异步的socket过来的时候,他会先挂起,等到这个缓冲区满了再唤醒,这样就会出现,三四秒recv不到消息,然后三四秒后一股脑的recv好几条消息,这个实在让人有些受不了啊。我们是做股票软件的,服务器推过来的报价,报价快的时候差不多一秒两口,在ios7上的时候,就是很匀速的recv,一口接一口的,而在ios8上的时候就是,是个好几秒一下子过来好几口,就好像攒够一盆水,一下子倒出来一样,这可是个很麻烦的事情啊。这对这个,我试了朋友提供的两个解决办法:①让socket不停的发消息,然后就能让socket就能一直在recv处理消息。②将缓冲区的大小设置小一些,然后就能让它减小阻塞的可能性。我经过验证,这俩方法都不行。

首先第一点,socket发消息跟收消息阻塞有必然联系么?我喜欢用实际代码验证,结果有。但是,这个不可行。你总不能莫名其妙的一直发包,不合逻辑。然后第二点,缓冲区设小一点,我依旧是用demo验证,而且确实有效,在8上,缓冲区的大小对于socket的阻塞影响极大,如果我将缓冲区设为100M,他大概1分钟才才收到报价,并且是一堆报价,然后试了各种size,然后发现真的是这个原因,虽然原因定位好了,但是解决办法却并不可行。首先,这个报价的数据包是小的,可是其他的数据的数据包有大包啊,一个完整包放不下的缓冲区必然面临崩溃啊,事实上改了项目中的缓冲区为8M
然后确实闪退了,原因就是缓冲区溢出了。然后我只能选择一个既能接受socket阻塞,又能容纳最大的完整包的size,然后差强人意的解决了问题,但这个问题的研究还在继续,我相信我一定能找到更好的办法,来处理这个的。

这里只提供一个解决思路,具体代码实现,需要了解的可以给我留言喔。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: