2013-10-01 15 views
12

Obecnie jestem w trakcie projektowania systemu do przesyłania wielu obrazów na serwer z aplikacji. Pliki będą przechowywane na urządzeniu lokalnym, a obecny pomysł polega na podzieleniu ich na porcje, a następnie przesłaniu ich po kawałku na serwer, czekając na komunikat o powrocie z powodzeniem przed przesłaniem następnego.iOS 7 - Przesyłanie danych do NSURLSession

Proces ten powinien przebiegać bezproblemowo dla użytkownika, należy nacisnąć przycisk, aby przesłać wszystkie obrazy, a następnie móc zamknąć aplikację i kontynuować ją w tle. Dzięki iOS 7 widziałem, że możesz przesyłać swoje pliki do nowego interfejsu API NSURLSession i mieć do czynienia z zadaniem przesyłania niezależnie od aplikacji.

Zastanawiałem się, czy ktoś wie, jak wiarygodny jest ten transfer. Jeśli przekażę mu cały obraz, co się stanie, jeśli połączenie internetowe spadnie w połowie? Czy usługa przenoszenia w tle może się ponowić w późniejszym czasie? Chodzi o to, że możemy przesłać obraz, a jeśli w połowie go nie uda, możemy po prostu kontynuować od tego momentu, gdy połączenie zostanie wznowione.

Jednym z pomysłów było podzielenie plików na porcje, a następnie przekazanie wszystkich porcji jako oddzielnych NSURLSessionUploadTasks i założenie, że ostatecznie wszystkie zostaną wysłane na serwer.

Innym było wysłać pierwszy klocek, używając:

uploadTaskWithRequest:fromData:completionHandler: 

a następnie w completitionHandler aby następnie wysłać następny kawałek. Mój problem polega na tym, że jeśli w tle następny kawałek będzie miał swoją

@property BOOL discretionary = true 

co oznacza, że ​​będzie wysyłać tylko przez WiFi, gdy podłączony. Muszę to do pracy nad wszystkimi sieciami i być w stanie poradzić sobie z zakłócenia.

Nie chcę żadnego kodu, tylko porady, jeśli jest to właściwy sposób, aby osiągnąć ten cel.

Odpowiedz

7

ll staram się odpowiedzieć na niektóre pytania

Jeśli przesyłanie zatrzymuje się w połowie drogi z powodu błędu, aplikacja powinna być uruchomiona w tle i powinieneś być w stanie wykonać wymaganą obsługę błędów. W twoim przypadku, jeśli serwer obsługuje wznawianie przesyłania, powinieneś być w stanie uzyskać przesunięcie, a następnie skonfigurować kolejne zadanie do przesłania następnego fragmentu.

Jeśli używasz NSURLSession skonfigurowanego do działania w tle, to nie może skonfigurować zadań wysyłania z procedurami obsługi ukończeń i nie możesz przesłać fragmentów przy użyciu obiektu NSData. Jedyną opcją jest pisać kawałki na dysku, a następnie użyć

uploadTaskWithRequest:fromFile: 

myślę, że to ma sens, ponieważ obiekt NSData rezyduje w pamięci aplikacji i załadowania tła są wykonywane przez demona zewnętrznego tak byłoby tylko prawo do przesłać pliki (z piaskownicy użytkownika). Również zamiast używania programów obsługi zakończenia będziesz musiał korzystać z delegatów do odsłuchu wywołań zwrotnych (gdy aplikacja znajduje się na pierwszym planie).

Jeśli nadal wolą używać obiektu NSData, następnie alternatywnym rozwiązaniem byłoby, aby utworzyć zadanie przy użyciu

downloadTaskWithRequest: 

W ten sposób można ustawić obiekt NSData w treści wniosku i przekazać, że wraz w żądaniu. Aby to osiągnąć, będziesz musiał skonfigurować swoją prośbę przy pomocy NSURLMutableRequest.

Dla właściwości uznaniowej, ponieważ domyślnie ustawiono wartość PRAWDA, nie jestem pewien, czy możemy coś z tym zrobić. Mówi, że transfery są bardziej prawdopodobne, do wystąpienia na Wi-Fi i po podłączeniu, więc może być mała szansa, że ​​może wystąpić przez komórkę, ale nie wierz mi na słowo, po prostu zgaduję.

+0

jeśli używam delegata, gdy poprzednie zdjęcie zostanie przesłane, w jego delegacji oddzwaniania, mogę kolejkować następne zadanie przesyłania zdjęć. czy to jest poprawne? -taki –

+0

Masz rację, możesz to zrobić. –

+2

@EbenbenMo Należy jednak zachować ostrożność, Jeśli transfer w tle zostanie zainicjowany, gdy aplikacja jest w tle, właściwość uznaniowa obiektu konfiguracyjnego jest traktowana jako prawdziwa. Po ustawieniu tej flagi transfery będą częściej występować po podłączeniu do zasilania i Wi-Fi. Ta wartość jest domyślnie fałszywa. Jeśli zadanie jest uruchamiane, gdy aplikacja jest w tle, zadanie to jest traktowane tak, jakby uznanie było prawdziwe, niezależnie od faktycznej wartości tej właściwości. W związku z tym kolejne przesyłanie może się zdarzyć dopiero po podłączeniu do WiFi i podłączeniu. –

Powiązane problemy