10

iOS 7 の Multipeer Connectivity Framework を使用して、2 つのデバイス間でファイルを送信しています。MCSession の sendData:toPeers:withMode を使用した以前の試みは本当に信頼できなかったため、NSStreams を使用してファイルを転送しています。残念ながら、私が得ている転送速度は非常に遅く、約 100kb/s です。これは、私が取り組んでいるアプリケーションでは機能しません。ファイル転送が行われる入力および出力ストリーム デリゲート メソッドを次に示します。

出力ストリーム (ストリームのデリゲート内)

...//previous code
 case NSStreamEventHasSpaceAvailable: {
            //we will only open the stream when we want to send the file.

            NSLog(@"Stream has space available");
            //[self updateStatus:@"Sending"];

            // If we don't have any data buffered, go read the next chunk of data.

            if (totalBytesWritten< outgoingDataBuffer.length) {
                //more stuff to read
                int towrite;
                int diff = outgoingDataBuffer.length-packetSize;
                if (diff <= totalBytesWritten)
                {
                    towrite = outgoingDataBuffer.length - totalBytesWritten;
                } else
                    towrite = packetSize;
                NSRange byteRange = {totalBytesWritten, towrite};
                uint8_t buffer[towrite];
                [outgoingDataBuffer getBytes:buffer range:byteRange];


                NSInteger bytesWritten = [outputStream write:buffer maxLength:towrite];
                totalBytesWritten += bytesWritten;
                NSLog(@"Written %d out of %d bytes",totalBytesWritten, outgoingDataBuffer.length);
            } else {
                //we've written all we can write about the topic?
                NSLog(@"Written %d out of %d bytes",totalBytesWritten, outgoingDataBuffer.length);
                [self endStream];
            }

            // If we're not out of data completely, send the next chunk.
        } break;

入力ストリーム

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

    switch(eventCode) {
        case NSStreamEventHasBytesAvailable:
        {
            NSLog(@"Bytes Available");
            //Sent when the input stream has bytes to read, we need to read bytes or else this wont be called again
            //when this happens... we want to read as many bytes as we can

            uint8_t buffer[1024];
            int bytesRead;

            bytesRead = [inputStream read:buffer maxLength:sizeof(buffer)];
            [incomingDataBuffer appendBytes:&buffer length:bytesRead];
            totalBytesRead += bytesRead;
            NSLog(@"Read %d bytes, total read bytes: %d",bytesRead, totalBytesRead);

        }break;
        case NSStreamEventEndEncountered:
        {
            UIImage *newImage = [[UIImage alloc]initWithData:incomingDataBuffer];
            [[self.detailViewController imageView] setImage:newImage];
            NSLog(@"End Encountered");

            [self closeStream];
            //this should get called when there aren't any more bytes being sent down the stream
        }
    }
 }

マルチスレッドまたは非同期ソケットを利用するわずかに変更された NSStream サブクラスを使用して、このファイル転送を高速化する方法はありますか?

4

3 に答える 3

3

ファイル転送が遅くなる原因として、私が気づいたことがいくつかあります。

  • セッションに非エアドロップ互換デバイスがある ( http://en.wikipedia.org/wiki/AirDrop )
  • WiFi の問題 (飽和ネットワーク、ルーターの問題、チャネルなど)

MAC上のiPhone 5S、iPad Air、およびiPhoneシミュレーターの間で、かなりの速度(つまり、500K /秒を意味します)を取得しています。

于 2013-12-03T18:10:35.247 に答える
1

MPC work on WiFi or bluetooth so it depends on what you are using. If you are using wifi to send files than you will get maximum speed as per the network strength.

于 2015-06-22T11:29:41.820 に答える