2011-10-08 4 views

Odpowiedz

147

Jest to proces trzech krok. Najpierw utworzysz obiekt NSURL, aby zachować adres URL, do którego próbujemy uzyskać dostęp. Dostarczymy ten adres URL do metody klasy NSData, +dataWithContentsOfURL:, aby uzyskać obraz w sieci jako dane nieprzetworzone, a następnie za pomocą metody klasy +imageWithData: na UIImage przekształcić dane w obraz.

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 
NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
UIImage *image = [UIImage imageWithData:imageData]; 

Należy pamiętać, że +dataWithContentsOfURL: wykonuje synchroniczne żądanie sieciowe. Uruchomienie tego w głównym wątku spowoduje zablokowanie interfejsu użytkownika do momentu otrzymania danych obrazu z sieci. Najlepszą praktyką jest uruchamianie dowolnego kodu sieciowego w wątku w tle. Jeśli kierujesz OS 4.0+ można zrobić coś takiego ...

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update the UI 
     self.imageView.image = [UIImage imageWithData:imageData]; 
    }); 
}); 
+1

Dzięki za sugestię, ale dostałem komunikat o błędzie podczas umieszczania kodu w klasie, zapoznaj się z moją aktualizacją –

+0

Naprawiono literówkę . W pierwszym wywołaniu dispatch_async() był dodatkowy nawias zamykający. –

+0

Dziękuję bardzo za wspaniałą odpowiedź. :-) – kernix

7

Oto co sam kod może wyglądać w Swift:

let image_url = NSURL("http://i.imgur.com/3yY2qdu.jpg") 

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    // do some task 
    let image_data = NSData(contentsOfURL: image_url!) 

    dispatch_async(dispatch_get_main_queue()) { 
     // update some UI 
     let image = UIImage(data: image_data!) 
     self.imageView.image = image 
    } 
} 
+0

W Xcode 9, preferowana składnia Swift dla asynchronicznej wysyłki byłaby następująca: 'DispatchQueue.global (qos: .default) .async {// block}' – atineoSE

0

Dla każdego, kto chce, aby załadować obraz z internetowej następujące biblioteki mogą być pomocne:

https://github.com/rs/SDWebImage

jest to kategoria, która obsługuje UIImageView asynchronicznej załadunku i buforowanie obrazu z URL.