Медленная передача файлов с использованием технологии Multipeer Connectivity

Я отправляю файл между двумя устройствами, используя iOS 7 Multipeer Connectivity Framework. Я использую NSStreams для переноса файла, поскольку моя предыдущая попытка использования MCSession sendData: toPeers: withMode была действительно ненадежной. К сожалению, скорость передачи, которую я получаю, очень медленная, около 100 кб/с, что не будет работать для приложения, над которым я работаю. Ниже приведены методы делегирования потока ввода и вывода, в котором происходит передача файлов.

Выходной поток (в делегате для потока)

...//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, который использует асинхронные сокеты?

Ответ 1

Есть несколько вещей, которые я заметил, которые вызывают медленные передачи файлов:

  • Наличие в сеансе устройства, не поддерживающего airdrop (http://en.wikipedia.org/wiki/AirDrop)
  • Проблемы с WiFi (насыщенная сеть, проблемы с маршрутизатором, канал и т.д.).

Я получаю приличные скорости (и приличным я имею в виду 500K/секунду) между iPhone 5S, iPad Air и iPhone Simulator на MAC.

Ответ 2

У меня были довольно приличные скорости передачи, и вдруг мне показалось, что я получаю один пакет каждые 15-30 секунд. Все выглядели хорошо на стороне отправителя, но пакеты просачивались в приемник. Я использую sendData: toPeers: withMode в моем приложении.

Одно из моих устройств отключило WiFi. Вернувшись назад, я восстановил свою производительность, даже если ни одно устройство не подключено к сети Wi-Fi.

Итак, я только делаю одноранговые одноранговые соединения с MPC, но все же, без участия WiFi-концентратора, похоже, что iOS использует сигнал Wi-Fi для переноса моих данных.) Я сделал см. в презентации от Apple некоторое время назад, что MPC по прямой BlueTooth - собака, и я могу сказать вам, что это так.

Ответ 3

MPC работает с WiFi или Bluetooth, поэтому зависит от того, что вы используете. Если вы используете Wi-Fi для отправки файлов, вы получите максимальную скорость в зависимости от силы сети.