0

そこで、Apple の PictureSharing/PictureSharingBrowser サンプルを使用してデータを送受信しています。これは、サーバー側で NSFileHandle を使用して、NSFileHandle の writeData メソッドを使用して画像を送信します。

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

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

大量のデータ (この場合は 1MB 相当のデータ) を送信するまでは、これでうまくいくようです。これを試みると、writeData メソッドの実行中にアプリケーションがハングします。クライアントはデータの読み取りを開始することさえせず、単に接続を開きますが、何も起こりません。(サーバーがすべてのデータを一度に送信する間、チャンクごとにデータを読み取ることになっています)。

どこかでデッドロックが発生していると推測していますが、どこかはわかりません。非同期を探してみました。NSFileHandleでチャックごとにデータチャックを書く方法を探したのですが、そのような方法が見つかりませんでした。

どんなガイダンスも役に立ちます!

4

1 に答える 1

0

私は基本的に 1 つのステップを逃しました... NSNetServiceBrowser のnetServiceBrowser: didFindService:( moreComing: delegate メソッド、単にすべての着信サービスに接続しようとする代わりに、代わりに (ドキュメントが言うように:)) サービスを保持し、デリゲートを設定しますサービスを見つけて、サービスの解決を試みます。

その後、 NSNetservice のデリゲート メソッドである*- (void)netServiceDidResolveAddress:(NSNetService )senderで、解決されたサービスへのストリームを開くことができます。

- (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.
于 2010-07-01T17:19:20.330 に答える