2013-03-24 16 views
8

Mam NSArray linków. Chcę przetworzyć je za pomocą internetowego interfejsu API do wyodrębniania artykułów (Clear Read), a przy wyniku zwróconym dla każdego artykułu (trochę HTML) wrzucam go do NSString.NSURLConnection i wiele asynchronicznych żądań - czy zakłóca przesyłane dane?

Mój problem wynika z faktu, że, powiedzmy, moja tablica ma 100 adresów URL, przechodzę przez tablicę, strzelając do API każdego elementu i uzyskując niektóre wyniki w JSON. To wywołuje asynchroniczne połączenia jak 100 NSURLConnection.

Nie byłem pewien, czy to byłby problem, ale kiedy podaję 100 adresów URL (prawdziwe ciągi, żadne nie są zerowe) dane, które często wracają, mają puste wartości dla kluczy JSON (kiedy powinny. 't), lub dane wracające to nil. Jest też mnóstwo duplikatów.

Czy powinienem obsługiwać wiele asynchronicznych połączeń lepiej niż teraz? Jeśli tak to jak?

Odpowiedz

8

Kilka myśli:

  1. Jeśli robisz jednoczesnych żądań asynchronicznych i używasz asynchronicznego NSURLConnection Pokochasz chcesz zdefiniować własną klasę dla tej operacji pobierania, aby upewnić się, że każde połączenie śledzi własne właściwości. W ten sposób wszystko może zostać zamknięte wewnątrz tej klasy, gdzie wynikowe obiekty do pobrania mogą śledzić, co jest pobrane, co zostało przeanalizowane, itp. Jeśli nie używasz asynchronicznego NSURLConnection (np. Używasz tylko dataWithContentsOfURL), to jest jeszcze łatwiejsze, mimo że utracono niektóre aktualizacje postępu, które zapewnia i/lub oferuje transmisja strumieniowa z poziomu NSURLConnection.

  2. Aby uzyskać najlepszą wydajność, należy wykonywać jednoczesne żądania. Powiedziawszy to, nie powinieneś mieć więcej niż czterech lub pięciu jednoczesnych żądań na konkretny serwer. Jest to ograniczenie narzucone przez system iOS, a zwłaszcza jeśli masz wolne połączenie sieciowe, w przeciwnym razie możesz mieć ustawiony limit czasu połączenia.

  3. Jeśli przeprowadzasz wstępne testy na symulatorze, możesz chcieć wypróbować "kondycję łącza sieciowego". Jest to część "Hardware IO Tools for Xcode", dostępnego pod adresem Downloads for Apple Developers. Występują problemy (takie jak wyżej wymienione problemy z przekroczeniem limitu czasu, jeśli zbyt wiele jednoczesnych żądań trafia na konkretny serwer), które objawiają się tylko w wolnych połączeniach.

  4. Powiedziawszy to, należy również przetestować swoje rozwiązanie na urządzeniu z rzeczywistą prędkością sieci. Z powodzeniem można bardzo skutecznie wykonywać równoległe zadania na symulatorze, który jest zbyt chciwy dla urządzenia. Ograniczenie liczby sesji równoczesnych do pięciu zmniejszy ten problem z zasobami, ale powinno to być częścią strategii testowania.

  5. Zgadzam się z JRG-Developer, że powinieneś zajrzeć do ustalonych struktur, takich jak AFNetworking.Pamiętaj, aby ustawić maxConcurrentOperationCount dla queue z AFHTTPClient, jeśli w kolejce 100 operacji.

  6. Nie wiem, ile danych obejmuje 100 żądań, ale należy uprzedzić, że proces zatwierdzania aplikacji odrzuca aplikacje, które wysyłają niezwykłe sieci w sieciach komórkowych. To, co stanowi nadmierną aktywność sieci komórkowej, nie jest wyraźnie określone w wytycznych dotyczących przeglądu aplikacji, jednak Avoiding iPhone App Rejection From Apple twierdzi, że powinieneś upewnić się, że nie przekroczysz 4,5 MB w ciągu 5 minut. Możesz użyć numeru Reachability, aby określić rodzaj sieci, na której się znajdujesz, i ostrzec użytkownika, jeśli jest na komórce (jeśli ilość danych zbliża się do tego progu).

+0

bardzo dobra odpowiedź –

3

Czy rozważałeś użycie platformy innej firmy - takiej jak AFNetworking - i ograniczając jednocześnie liczbę asynchronicznych połączeń? Być może może to pomóc/rozwiązać twój problem.

W szczególności można rozważyć utworzenie klasy networking manager, która tworzy i zarządza AFHTTPClient(s), która z kolei zarządza AFHTTPRequestOperations dla każdego punktu końcowego (podstawowego adresu URL), który uderzyłeś.

+0

Jestem trochę nowy w tym, co to opisuję, więc czy możliwe jest dla ciebie, aby dla mnie ostatni akapit był dla mnie bardziej ekscytujący? – user212541

Powiązane problemy