老谭笔记

解决CFFTPStream因网络改变引起的Crash

最近项目中需要用到读取FTP的功能,于是使用了CFReadStreamCreateWithFTPURL来创建一个CFFTPStream,刚使用的时候并没有发现有任何问题,但偶然的机会我Mac休眠了,然后我唤醒Mac之后,当程序中再次创建CFFTPStream后,并在Stream执行Open方法就Crash掉了,最初以为是我使用的方法不正确,于是下载了Apple的Sample之后,发现他的代码也是这样写的,我就纳闷了,Google了之后也找不到任何的线索,于是只有仔细的查看Apple的Document,最后看到了CFReadStreamSetProperty中有一个属性叫做kCFStreamPropertyFTPAttemptPersistentConnection,是用于尝试使用现有的连接,默认是true,也就是当创建过一次FTP链接之后,再次创建时就会尝试使用之前的连接状态,但如果网络环境发生改变之后,这样的机制就有可能产生Crash,在CFReadStreamCreateWithFTPURL之后添加代码:

CFReadStreamSetProperty(ftpStream, kCFStreamPropertyFTPAttemptPersistentConnection, kCFBooleanFalse);

就可以解决这个问题了,但这样做又会造成另一个问题,那就是如果你的代码中会频繁的创建CFFTPStream,并且来源于同一个地址,那么这样设置之后就会造成链接速度变慢,因为每一次连接都没有使用持久性的连接状态,会重新创建全新的连接。所以这此应该适当的做一些修改,比如当检测到网络环境发生改变之后才设置该属性,具体的实现此处就不再详细说明了。