2015-05-29 9 views
5

Otrzymywałem raporty o błędach, że moja aplikacja iOS nie mogła przesłać obrazów na wolnych połączeniach. Chociaż mój limit czasu prawdopodobnie nie był wystarczająco wysoki, pojawił się kolejny problem.NSURLSession, zadanie przesyłania - Uzyskaj rzeczywiste bajty przesłane

Zauważyłem, że postęp przesyłania szybko osiągnął 100%, mimo że widziałem w Charlesu, że bajty nadal były przesyłane. Używam następujący sposób NSURLSession:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
            fromData:(NSData *)bodyData 
          completionHandler:(void (^)(NSData *data, 
                 NSURLResponse *response, 
                 NSError *error))completionHandler 

i wdrożyć następujące metody delegata do odbierania zdarzeń progress:

- (void)URLSession:(NSURLSession *)session 
       task:(NSURLSessionTask *)task 
    didSendBodyData:(int64_t)bytesSent 
    totalBytesSent:(int64_t)totalBytesSent 
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 

Właściwie używam AFNetworking 2.5.2, który korzysta z tej metody. Moja teoria mówi, że ta metoda delegatów raportuje bajty wysłane z telefonu, a NIE faktyczne przesłane bajty.

Wysłanie 300kb przy bardzo niskim połączeniu spowoduje natychmiastowe wysłanie 5-6 paczek i zgłoszenie postępów w wysokości 100% podczas oczekiwania na ich odebranie.

Czy można uzyskać informacje o postępie w faktycznej liczbie przesłanych bajtów?

Odpowiedz

1

Tak, jest to możliwe!

[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
    float prog = (totalBytesWritten/(totalBytesExpectedToWrite * 1.0f) * 100); 
    [self.progBar setProgress:prog]; 
    NSLog(@"%f%% Uploaded", (totalBytesWritten/(totalBytesExpectedToWrite * 1.0f) * 100)); 

    }]; 
+0

Zakładam, że 'operacja' jest' AFHTTPRequestOperation'. Ma to tę samą "wadę", jak obawiam się powyżej, stosując sesję. –

+0

Jeśli wykonujesz operację przesyłania w prawidłowy sposób, nie powinno to powodować żadnych problemów. Przesłałem 30 zdjęć za pomocą tej samej operacji, a także śledziłem postępy opisane w odpowiedzi. Upewnij się, że używasz "wieloczęściowy". – Vizllx

+0

Czy próbowałeś użyć aplikacji proxy, takiej jak Charles, aby zmniejszyć prędkość wysyłania do np. 30 kpbs? Wtedy postęp zaczyna działać dziwnie, jak opisano w powyższym numerze –

Powiązane problemy