2013-10-10 18 views
10

Invio un file tra due dispositivi utilizzando Multipeer Connectivity Framework di iOS 7. Sto utilizzando NSStreams per trasferire il file, come il mio precedente tentativo di utilizzare sendData di MCSession: toPeers: withMode era davvero inaffidabile. Sfortunatamente le velocità di trasferimento che sto ottenendo sono molto lente, circa 100kb/s, che non funzioneranno per l'applicazione su cui sto lavorando. Ecco i miei metodi delegati di input e output stream, ovvero il luogo in cui avviene il trasferimento dei file.Trasferimento file lento tramite Multipeer Connettività

Output Stream (nel delegato per il flusso)

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

flusso di input

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

C'è un modo per accelerare questo trasferimento di file attraverso sia il multithreading o utilizzando una sottoclasse NSStream leggermente modificata che fa uso di socket asincroni?

+0

Stai ancora navigando tra pari? Questo articolo (http://mzsanford.com/blog/ios7-multipeer-wifi-slow/index.html) spiega come la navigazione/la pubblicità possono influire sulle prestazioni globali del Wi-Fi. Inoltre, hai questo lavoro andando dal dispositivo al simulatore? Posso passare da Sim a Device, ma quando provo a inviare al Sim il mio stream di input tenta di leggere i dati una volta e trova i dati zero, quindi si disconnette. – Brian

+0

Ehi Brian. La mia configurazione consiste in due applicazioni in esecuzione separate di ipad mini che eseguono un trasferimento di file. Sto ancora esplorando i peer dopo che il browser e l'inserzionista si sono connessi perché quando smetto di cercare peer perdo la connessione al dispositivo. Stavo incontrando problemi simili con la disconnessione frequente durante l'utilizzo del metodo sendData: toPeers. Questo è il motivo per cui sono passato all'utilizzo dei metodi Stream. –

+0

È strano perché Air Drop da dispositivo a dispositivo funziona così velocemente, ma l'esecuzione di un trasferimento di file è molto lenta. Apple deve fare qualcosa di magico dietro le quinte per la sua implementazione. –

risposta

3

Ci sono un paio di cose che ho notato che causano il trasferimento lento dei file:

Ho ottenuto velocità decenti (e decente intendo 500K/secondo) tra un iPhone 5S, iPad Air e iPhone Simulator sul MAC.

1

Ho avuto alcuni tassi di trasferimento abbastanza decenti per un po 'e improvvisamente sembrava che stavo ricevendo un pacchetto ogni 15-30 secondi. Tutto sembrava a posto sul lato del mittente, ma i pacchetti gocciolavano nel ricevitore. Uso sendData: toPeers: withMode nella mia app.

Uno dei miei dispositivi aveva il WiFi spento. Ripristinandolo ripristina le mie prestazioni anche se nessuno dei due dispositivi è connesso a una rete wifi.

Pertanto, eseguo sempre connessioni peer-to-peer peer-to-peer con MPC, ma ancora, senza l'hub WiFi coinvolto, sembra che iOS stia facendo uso del segnale WiFi per trasportare i miei dati.) I ho visto in una presentazione di Apple un po 'indietro che MPC over straight BlueTooth è un cane e posso dirti che è così.

1

MPC funziona su WiFi o Bluetooth, quindi dipende da cosa si sta utilizzando. Se si utilizza la rete wifi per inviare file, si otterrà la massima velocità in base alla potenza della rete.