Objective c 如何使用NSFileHandle';什么是可写处理程序?

Objective c 如何使用NSFileHandle';什么是可写处理程序?,objective-c,ios5,objective-c-blocks,osx-lion,nsfilehandle,Objective C,Ios5,Objective C Blocks,Osx Lion,Nsfilehandle,从OS X 10.7和iOS 5.0开始,NSFileHandle有两个新属性:readabilityHandler和writeabilityHandler。我尝试使用writeabilityHandler,但没有成功。文档很奇怪,看起来他们复制了易读性handler的粘贴描述,并将wordread替换为write 根据文件,分配块最终应调用块。事实并非如此 - (void)sendResponse:(NSData*)dataToSend { _incomingHandle.writea

从OS X 10.7和iOS 5.0开始,NSFileHandle有两个新属性:readabilityHandler和writeabilityHandler。我尝试使用writeabilityHandler,但没有成功。文档很奇怪,看起来他们复制了易读性handler的粘贴描述,并将wordread替换为write

根据文件,分配块最终应调用块。事实并非如此

- (void)sendResponse:(NSData*)dataToSend
{
    _incomingHandle.writeabilityHandler = 
    ^(NSFileHandle* fileHandle)
    {
        [fileHandle writeData:dataToSend]; // exception is thrown here
        fileHandle.writeabilityHandler = nil;
    };
    // Above block is not called without this line:
    //[_incomingHandle writeData:dataToSend];
}
只有当我尝试同步写入句柄时才会调用它,
[[u incomingHandle writeData:dataToSend]
,这是没有意义的。在调用它之后,它抛出一个异常:EXC_BAD_指令

*** Terminating app due to uncaught exception 'NSFileHandleOperationException', reason:
'*** -[NSConcreteFileHandle writeData:]: Resource temporarily unavailable'
我也试着一件一件地发送数据。不走运


有人成功地使用过这个属性吗?

嗯,你有一个我可以尝试的示例项目吗?我对它没有任何问题,即使是在做一些愚蠢的事情,比如嵌套处理程序时。一个显示它不工作的测试用例可能有助于找出问题所在


您可能遇到的一个问题是,在NSFileHandle中使用dispatch_io将修改您传入的任何fd的属性。这可以说是NSFileHandle中的一个bug,但目前确实如此://

如果苹果发布了一些示例代码来演示这些新的处理程序,那就太好了,但据我所知,它们没有。也许WWDC视频(如果您是注册开发人员,您可以访问该视频)有一些提示和示例代码?这就是重点,我没有找到任何示例。另外,我不记得他们在WWDC 2011视频中提到过NSFileHandle,至少在我看过的视频中是这样。“资源暂时不可用”意味着write正在返回EAGAIN,这意味着你的文件句柄当前不可写,这解释了为什么它不调用你的writeabilityHandler。问题是为什么他会回来?你从哪里来的?它还可能发生什么事?@rob mayoff我打开一个套接字并用它初始化一个文件句柄。我订阅“NSFileHandleConnectionAcceptedNotification”通知。收到该文件后,我从“[[aNotification userInfo]objectForKey:NSFileHandleNotificationFileHandleItem]”获取文件句柄,当我需要写入数据“[\u incomingHandle writeData:dataToSend];”时,我会保留并使用该句柄。该代码已经运行了大约三年。它在OSX 10.4-10.7、iOS2.0-4.2中工作。当我写一个大文件时,它在iOS5中停止工作。基本上,它在130 kb上抛出一个异常。“低于这个数量的任何东西仍然可以完美工作。”rob mayoff说,所以,我想他们可能已经改变了NSFileHandle中的某些内容。也许从现在起,我需要使用提供的新属性,但我不知道如何使用它们。我使用的代码是几年前编写的。然而,我发现的最接近的例子是这里,问题是如何使用他们提供的新处理程序?对。我是说我使用了新的处理程序,听起来你好像遇到了bug。我对分析这些bug很感兴趣,看看我是否能了解一些正在发生的事情。酷。你是怎么用的?我个人不明白如何将数据写入文件句柄。我应该怎么做才能让它调用writeabilityHandler块?只使用NSPIPE而不是网络套接字,但这不重要。在与dispatch\u source\u type\u WRITE类型的dispatch\u源事件处理程序的事件处理程序块完全相同的情况下调用该块。一个非常简单的测试如下: