所以我正在使用Apple的PictureSharing / PictureSharingBrowser示例来发送和接收数据。这使用服务器端的NSFileHandle使用NSFileHandle的writeData方法发送图片。
NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];
[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];
这似乎工作正常,直到我想发送大量数据(在这种情况下,1MB的数据)。当我尝试这个时,应用程序在执行writeData方法时挂起。客户端甚至没有开始读取数据,它只是打开连接,但没有任何反应。 (它应该按块读取数据块,而服务器一次发送所有数据)。
我猜测某些地方发生了一些死锁,但我不确定在哪里。我试图寻找异步。用NSFileHandle写chuck写数据的方法,但我找不到这样的方法。任何指导都会有所帮助!
答案 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.