2013-10-10 31 views
10

Wysyłam plik między dwoma urządzeniami za pomocą Multoscer Connectivity Framework systemu iOS 7. Używam NSStreams do przesyłania pliku, ponieważ moja poprzednia próba użycia sendSata MCSession: toPeers: withMode była naprawdę niewiarygodna. Niestety prędkości przesyłu, które dostaję, są naprawdę powolne, około 100kb/s, co nie zadziała w przypadku aplikacji, nad którą pracuję. Oto moje metody przekazywania strumieni wejściowych i wyjściowych, w których odbywa się przesyłanie plików.Powolne przesyłanie plików za pomocą architektury Multipeer Connectivity

strumienia wyjściowego (w delegata dla strumienia)

...//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; 

strumień wejściowy

- (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 
     } 
    } 
} 

Czy istnieje sposób, aby przyspieszyć ten transfer plików przez obu wielowątkowości lub stosując nieco zmodyfikowaną NSStream podklasę korzysta z asynchronicznych gniazd?

+0

Czy nadal przeglądasz strony równorzędne? Ten artykuł (http://mzsanford.com/blog/ios7-multipeer-wifi-slow/index.html) mówi o tym, jak przeglądanie/reklama może wpływać na ogólną wydajność Wi-Fi. Czy to działa od urządzenia do symulatora? Mogę przejść z Sim do urządzenia, ale kiedy próbuję wysłać do Sima, mój strumień wejściowy próbuje raz odczytać dane i znajdzie zero danych, a następnie rozłączy się. – Brian

+0

Hej, Brian. Moja konfiguracja składa się z dwóch ipad mini działających osobnych aplikacji wykonujących transfer plików. Wciąż przeglądam strony równorzędne po połączeniu przeglądarki i reklamodawcy, ponieważ po przerwaniu przeglądania w sieciach równorzędnych tracę połączenie z urządzeniem. Podczas korzystania z metody sendData: toPeers miałem podobne problemy z częstym rozłączaniem. Właśnie dlatego przełączyłem się na używanie metod Stream. –

+0

To po prostu dziwne, ponieważ Air Drop z urządzenia do urządzenia działa tak szybko, ale wykonywanie transferu plików jest bardzo powolne. Apple musi robić trochę zakulisowych magii dla własnej implementacji. –

Odpowiedz

3

Istnieje kilka rzeczy, zauważyłem, które powodują transfer powolny plików:

Uzyskuję przyzwoite prędkości (i przyzwoicie mam na myśli 500K/sekundę) między iPhonem 5S, iPad Air i iPhone Simulator na MAC.

1

Przez chwilę miałem dość przyzwoite wskaźniki transferu i nagle wydawało mi się, że otrzymuję jeden pakiet co 15 do 30 sekund. Wszystko wyglądało dobrze po stronie nadawcy, ale pakiety wlewają się do odbiornika. Używam sendData: toPeers: withMode w mojej aplikacji.

Jedno z moich urządzeń miało wyłączone Wi-Fi. Włączenie go przywróciło moją wydajność, mimo że żadne urządzenie nie jest podłączone do sieci Wi-Fi.

Tak więc, robię tylko połączenia ad-hoc typu peer-to-peer z MPC, ale mimo to, bez udziału koncentratora WiFi, wydaje się, że iOS wykorzystuje sygnał WiFi do przenoszenia moich danych.) I widziałem w prezentacji od Apple jakiś czas temu, że MPC nad prostą BlueTooth to pies i mogę powiedzieć, że tak jest.

1

MPC działa na Wi-Fi lub bluetooth, więc zależy to od tego, z czego korzystasz. Jeśli korzystasz z wifi do wysyłania plików, otrzymasz maksymalną prędkość zgodnie z siłą sieci.