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?
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
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. –
È 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. –