0

ファイルとアクションをユーザーに送信できるアプリケーションに取り組んでいます。ユーザーはいつでもサーバーからファイルを要求できます (クライアント サーバー モデル)。場合によっては、ファイルがかなり大きく (10 MB など)、送信中に他の小さなアクションが接続ユーザーに送信されるのが遅れる場合があります。Gamekit には、送信用のスレッドと受信用の別のスレッドがあるようです。

小さなアクションパケットが大きなファイルが送信されるのを待つ必要がないようにするために、追加の送信スレッドを持つことが可能かどうか疑問に思っています。グランドセントラルディスパッチでキューを作成しようとしましたが、残念ながら、送信はまだ1つのスレッドしか使用していないようです.

dispatch_async(pdfSendQ, ^{

    NSString *filePath = [_document.fileURL path] ;


    if (!_pdfNSData)
        _pdfNSData = [NSData dataWithContentsOfFile:filePath];

    for(NSData* packet in self.packets) {
        NSError* error = nil;
        [_session sendData:packet toPeers:[NSArray arrayWithObject:peerID] withDataMode:GKSendDataReliable error:&error];
        if(error != nil) {
            [[NSNotificationCenter defaultCenter] postNotificationName:kPacketFailedNotification object:self userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]];
        } else {
            [[NSNotificationCenter defaultCenter] postNotificationName:kPacketSentNotification object:self];
        }
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:kFileSentNotification object:self];

});

大きなファイルの送信を「中断」するために個別の小さなアクション パケットを取得することは可能だと思いますが、これはかなり複雑であり、もっと簡単な方法があるかどうか疑問に思っていました。

4

2 に答える 2

2

GKSession は、独自のスレッドで実際のネットワーキングをすべて行います。詳細については、lldb / Xcode を参照してください。10MB をチャンクで送信する場合は、データを送信するだけです。GKSession は書き込みをキューに入れ、可能な場合はバックグラウンド スレッドで送信します。つまり、メイン スレッドが枯渇する心配はありません。データを書き込むだけです。

于 2013-03-13T20:52:52.277 に答える
0

正直なところ、GameKitの経験はありませんが、最終的にはストリームソケットである必要があります。10mbファイルで巨大なパケットを送信しようとする代わりに、小さな100kbチャンクで送信してみませんか。そうすれば、チャンクの途中で中断する代わりに、チャンクが終了するのを待って、言及した別のタイプのパケット(より小さなアクションパケット)をキューに入れることができます。反対に、大きなファイルの断片を一緒に追加するだけの問題ですが、何か他のものを入手した場合は、それを処理することができます。そうすれば、応答性が向上します

于 2013-01-03T19:36:38.727 に答える