【问题标题】:Sending large amounts of data with NSFileHandle使用 NSFileHandle 发送大量数据
【发布时间】:2010-06-27 23:46:23
【问题描述】:

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

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

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

在我想发送大量数据(在本例中为 1MB 的数据)之前,这似乎工作正常。当我尝试这样做时,应用程序在执行 writeData 方法时挂起。客户端甚至没有开始读取数据,它只是打开了连接,但什么也没有发生。 (它应该是逐块读取数据,而服务器一次发送所有数据)。

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

任何指导都会有所帮助!

【问题讨论】:

  • 嗯...我已经确定只有当我只有一个应用程序实例运行时才会发生这种情况,并且它既是服务器又是客户端。当我运行两个实例并将一个作为服务器,另一个作为客户端时,一切正常,但我需要能够让一个实例同时充当服务器和客户端(因为用户可以与其他人共享他们的信息并查看其他人分享的信息)

标签: objective-c cocoa macos nsfilehandle


【解决方案1】:

我基本上错过了一步......在 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 2011-03-23
    • 1970-01-01
    • 2013-11-28
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多