2011-03-04 16 views
7

Używam instancji NSURLConnection na iPhonie do żądania danych z serwera, zarządzanego przez delegata jak zwykle. Żądania są dość częste (może raz na 2 minuty) i mają wspólny i stały adres URL. Zamiast widząc dobre wystąpienie NSURLConnection zwolniony po każdym pobrania, a następnie nowy tworzonego:Ponowne użycie instancji NSURLConnection

  1. istnieje jakikolwiek warto w zachowaniu pierwszego połączenia i ponowne wykorzystanie go? (Mam nadzieję, że jedno dobre uwierzytelnienie powinno być warte tysiąc.)

  2. Jeśli tak, jak mogę go użyć ponownie? Wyjątkowa metoda w dokumentach to -start, ale zdaje się to powodować awarię aplikacji po wywołaniu już używanej (i niezerowej) instancji NSURLConnection. [Docs mów -start „Powoduje słuchawkę, aby rozpocząć ładowanie danych, gdy nie ma już”]

W przypadku jest to pomoc w odniesieniu do powyższych pytań, proponuję (było!):

if (connection_ == nil) 
    { 
    connection_ = [NSURLConnection connectionWithRequest:request 
               delegate:self]; 
    } 
    else 
    { 
    [connection_ start]; 
    } 
+0

Interesujące pytanie ... :) – Jasarien

+0

To jest mały duplikat, zobacz http://stackoverflow.com/questions/886810/nsurlconnection-is-run-many-times. Nadal nie ma dobrej odpowiedzi. Wygląda na to, że musisz wymyślić własną klasę do tego zadania. – SK9

+0

Wydaje się, że jedną z odpowiedzi na to pytanie jest sugerowanie strumienia HTTP zamiast połączenia jednorazowego. Pozostawienie otwartego strumienia i używanie go co 2 minuty nie byłoby dobrym pomysłem. Naprawdę nie widzę problemu z udostępnianiem i odtwarzaniem obiektu połączenia. Czy to nie jest wstępna optymalizacja? – Jasarien

Odpowiedz

3

Docs zdaje się mówić, że połączenie URL zachowuje to delegata (niekonwencjonalne, ale w tym przypadku konieczne), a następnie uwalnia go, gdy połączenie zakończy ładowanie, nie powiedzie się lub zostanie anulowane.

Problem polega na tym, że delegat nie jest właściwością możliwą do ustawienia na NSURLConnection, więc nie można go zresetować po wydaniu. Powoduje to, że połączenie URL jest bezużyteczne po uruchomieniu go raz, co wymaga zwolnienia i ponownego utworzenia, jeśli chcesz zrobić to ponownie.

+0

@J: To też zebrałem. Nie wiem o alternatywach dla NSURLConnection tutaj, może ASI [http://allseeing-i.com/ASIHTTPRequest/] itp? – SK9

+0

Nie użyłem 'AIHTTPRequest', ale uważam, że jest on zbudowany na' NSURLConnection', więc nawet jeśli będziesz mógł ponownie użyć instancji jednego z nich, nadal będzie zwalniać i odtwarzać połączenie URL pod maską. – Jasarien

+0

@J: Czy możliwe jest wcześniejsze utworzenie uwierzytelnionego NSURLConnection i opóźnienie wykonania żądania? (tzn. ładuj pistolet, strzelaj, gdy jest gotowy). – SK9