2011-11-20 17 views
5

Tworzę aplikację, która uzyskuje dostęp do niektórych danych przy pierwszym uruchomieniu, a następnie wyświetla go. Pobierałem te dane w ten sposób:Czy dataWithContentsOfURL jest zła podczas uruchamiania aplikacji?

NSData *data = [NSData dataWithContentsOfURL:url]; 

Czy to źle? W tej chwili ustawiłem metodę, która zawiera to, aby działać w wątku tła przy użyciu GCD, ale słyszałem, że od dataWithContentsOfURL jest synchroniczna, to jest złe. Czy są jakieś opinie na ten temat?

+0

@bryanmac Użyj znacznika Grand-Central-Dispatch dla pytań Apple GCD. –

Odpowiedz

5

To źle, jeśli uruchomisz go w głównym wątku UI. To zablokuje reakcję aplikacji, która jest zła, ale jest jeszcze gorsza po uruchomieniu.

Musisz zrobić to asynchronicznie. Możesz to zrobić, uruchamiając tę ​​metodę w wątku w tle (GCD dispatch_async) lub używając asynchronicznych metod NSUrlConnection.

Oto przykład użycia GCD do pracy w tle, a następnie zaktualizować UI (po zrobione) na głównym wątku:

GCD, Threads, Program Flow and UI Updating

Inną opcją jest metoda asynchroniczny z NSURLConnection. Zobacz metod initWithRequest tutaj:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

+0

Uruchamiając go w wątku tła za pomocą GDC, czy to będzie problem? – Yep

+0

właśnie edytowane - możesz uruchamiać z GCD. Dodam kilka wskazówek. – bryanmac

+1

Zrobiłem to w ten sposób: 'dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ } // zrób coś });' – Yep

3

Jesteś bezpieczny tak długo jak używasz go w wątku tła.
Pomysł, że ładowanie synchroniczne jest złe, jest ważny tylko dla głównego wątku interfejsu użytkownika. Długotrwałe działanie w głównym wątku UI spowoduje, że aplikacja przestanie reagować. Robienie tego w tle jest właściwym sposobem na zrobienie tego. Rozważ również użycie:

+dataWithContentsOfURL:options:error: 

, aby można było uzyskać błąd, jeśli coś pójdzie nie tak.

Powiązane problemy