代码之家  ›  专栏  ›  技术社区  ›  Ken Reid

CFWriteStreamCanAcceptBytes阻塞

  •  1
  • Ken Reid  · 技术社区  · 12 年前

    我已经创建了一个程序,可以成功地将一张图像从我的iPhone发送到我的Mac。问题是,一旦发送完成,我就想发送一些其他数据(确切地说是不相关的数据)。每当我试图发送数据时,我都会被以下行阻止:

    if ( !CFWriteStreamCanAcceptBytes((CFWriteStreamRef)_outputStream) ) {
        NSLog(@"FAILED ErrorCode:2 saveAsWallpaper in server.m");
        return;
    }
    

    我不关闭任何流或类似的东西。我认为问题可能出在以下行:

    CFWriteStreamSetProperty(writeStream,kCFStreamPropertyShouldCloseNativeSocket,
                                         kCFBooleanFalse);
    

    但这应该可以防止插座关闭。如果需要的话,我可以提供更多的代码,但我希望有更多指向正确方向的指针,而不是解决方案。

    欢迎任何帮助, 谢谢

    2 回复  |  直到 12 年前
        1
  •  1
  •   user387184    12 年前

    在新款iPhone5上,这种方法似乎有一个错误(或者至少不一致)。同样的CFWriteStreamCanAcceptBytes在iPhone 3GS上运行良好,但在iPhone 5上则不然。

    到目前为止,我发现的唯一解决方案是不使用 CFWriteStreamCanAcceptBytes 再也不用写了——这很好。

    唯一的问题是,一旦连接丢失并且您无论如何都在写,超时时间大约需要20-30秒。

    要第一次处理此问题,可以使用 performSelectorInBackground 并检查返回是否花费了太长时间,然后您可以确定连接已丢失,并设置您自己的标志,该标志可以用作后续调用写入的守门员。

    但在99%的情况下,它工作正常,因为连接正常。

    我尝试了很多替代方案,但没有办法阻止 write 一旦开始执行-所以这就是我使用 后台执行选择器 .

    即使是一个本应在5秒内执行的计时器也必须等待,因为没有成功的写入需要花费时间,而且根本不接受任何中断。

        2
  •  0
  •   Ken Reid    12 年前

    因此,事实证明,关闭ARC在某种程度上有所帮助。这样的行在打开它的情况下无法正常工作(因为从外观上看,它需要手动内存管理):

    if (kCFSocketSuccess != CFSocketSetAddress(_socket, (CFDataRef)CFBridgingRetain(address4))) {
    

    注意“保留”一词。

    不是每个人都能解决的问题,但关闭ARC,然后自己管理泄漏,我的项目一切都很顺利。

    推荐文章