NSFileHandleで大量のデータを送信します
-
01-10-2019 - |
質問
そこで、AppleのPicturesHaring/PicturesHaringBrowserサンプルを使用して、データを送信および受信しています。これにより、サーバー側のnsfilehandleを使用して、nsfilehandleのwritedataメソッドを使用して画像を送信します。
NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];
[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];
これは、大量のデータを送信するまで正常に機能するようです(この場合、1MB相当のデータ)。私がこれを試みると、writedataメソッドの実行中にアプリケーションがハングします。クライアントはデータの読み取りを開始せず、単に接続を開きますが、何も起こりません。 (サーバーは一度にすべてのTEHデータを送信する一方で、チャンクごとにデータチャンクを読み取ることになっています)。
私はいくつかのデッドロックがどこかで発生していると推測していますが、どこにあるのかわかりません。私は非同期を探しようとしました。 nsfilehandleでチャックによるデータチャックを書く方法は、そのような方法を見つけることができませんでした。
どんなガイダンスも役立ちます!
解決
基本的に1つのステップを逃しました... nsnetservicebrowserの NetServiceBrowser:didfindService :(モアコミング: 代わりに、すべての着信サービスに接続しようとする代わりに、私は代わりに(ドキュメントが言うように)サービスを保持し、そのために見つけたサービスの代表者を設定し、サービスを解決しようとします。
その後、 * - (void)netservedidResolveaddressで解決されたサービスにストリームを開くことができます:(nsnetservice )送信者 これは、NSNETSVICEの代表法です。
- (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.