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