使用NSFileHandle发送大量数据

时间:2010-06-27 23:46:23

标签: objective-c cocoa macos nsfilehandle

所以我正在使用Apple的PictureSharing / PictureSharingBrowser示例来发送和接收数据。这使用服务器端的NSFileHandle使用NSFileHandle的writeData方法发送图片。

NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];

[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];

这似乎工作正常,直到我想发送大量数据(在这种情况下,1MB的数据)。当我尝试这个时,应用程序在执行writeData方法时挂起。客户端甚至没有开始读取数据,它只是打开连接,但没有任何反应。 (它应该按块读取数据块,而服务器一次发送所有数据)。

我猜测某些地方发生了一些死锁,但我不确定在哪里。我试图寻找异步。用NSFileHandle写chuck写数据的方法,但我找不到这样的方法。

任何指导都会有所帮助!

1 个答案:

答案 0 :(得分:0)

我基本上错过了一步...在NSNetServiceBrowser的 netServiceBrowser:didFindService :( moreComing:委托方法,而不是我只是尝试连接到每个传入的服务,而不是(正如文档所说: ))保留服务,为找到的服务设置委托,并尝试解析服务。

然后我可以在* - (void)netServiceDidResolveAddress :( NSNetService )sender 中打开已解析服务的流,这是NSNetservice的委托方法。

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [aNetService retain];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:5.0];

}

- (void)netServiceDidResolveAddress:(NSNetService *)service{

    NSInputStream * istream;
    [sender getInputStream:&istream outputStream:nil];
    [istream retain];
    [istream setDelegate:self];
    [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [istream open];

    [service release];
}

//... NSStreamDelegate method to retrieve the data via the stream.