1

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

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

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

CFWriteStreamSetProperty(writeStream,kCFStreamPropertyShouldCloseNativeSocket,
                                     kCFBooleanFalse);

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

欢迎任何帮助,谢谢!

4

2 回答 2

1

新 iPhone5 上的该方法似乎存在错误(或至少不一致)。相同的 CFWriteStreamCanAcceptBytes 在 iPhone 3GS 上完美运行,但在 iPhone5 上却不行。

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

唯一的问题是,一旦连接丢失并且您仍然写入,超时大约需要 20-30 秒。

第一次处理这个问题时,您可以使用在另一个任务中执行写入performSelectorInBackground并检查是否花费了太长时间才能返回,然后您可以确定连接丢失并设置您自己的标志,该标志可用作看门人后续调用 write。

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

我尝试了许多替代方案,但是write一旦开始执行就无法停止执行 - 所以这就是我使用performSelectorInBackground.

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

于 2013-03-27T19:50:11.450 回答
0

所以事实证明,关闭 ARC 以某种方式有所帮助。像这样的行无法正常工作(因为从外观上看它需要手动内存管理):

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

请注意“保留”一词。

不是每个人的解决方案,但关闭 ARC 然后自己管理泄漏让我的项目一切正常。

于 2013-03-31T13:40:41.770 回答