Chciałbym załadować obraz z adresu URL w mojej aplikacji, więc najpierw spróbowałem z Objective-C i działało to jednak w Swift, mam błąd kompilacji:
Opcja „imageWithData” jest niedostępna: użyj konstrukcji obiektu „UIImage (data :)”
Moja funkcja:
@IBOutlet var imageView : UIImageView
override func viewDidLoad() {
super.viewDidLoad()
var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png")
var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)
imageView.image = UIImage.imageWithData(data)// Error here
}
W celu C:
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:(@"http://myURL/ios8.png")];
NSData *data = [NSData dataWithContentsOfURL:url];
_imageView.image = [UIImage imageWithData: data];
_labelURL.text = @"http://www.quentinroussat.fr/assets/img/iOS%20icon's%20Style/ios8.png";
}
Czy ktoś może mi wyjaśnić, dlaczego imageWithData:
nie działa ze Swift i jak mogę rozwiązać problem.
imageURL.image = UIImage(data: myDataVar)
Odpowiedzi:
Xcode 8 lub nowszy • Swift 3 lub nowszy
Synchronicznie:
Asynchronicznie:
Utwórz metodę za pomocą modułu obsługi zakończenia, aby uzyskać dane obrazu z adresu URL
Utwórz metodę pobierania obrazu (rozpocznij zadanie)
Stosowanie:
Przedłużenie :
Stosowanie:
źródło
UITableView
którym komórka pokazuje obraz, a obraz jest aktualizowany po zwróceniu odmalowanej komórki. Jeśli proces nr 1 trwa dłużej niż proces nr 2, proces nr 2 wyświetli jego obraz, a następnie zostanie zaktualizowany przez proces nr 1, nawet jeśli ten obraz nie jest już ważny dla użytkownika.(Aktualizacja Swift 4) Aby bezpośrednio odpowiedzieć na oryginalne pytanie, oto szybki odpowiednik opublikowanego fragmentu Celu-C.
ZRZECZENIE SIĘ:
Ważne jest, aby pamiętać, że
Data(contentsOf:)
metoda pobierze zawartość adresu URL synchronicznie w tym samym wątku, w którym wykonywany jest kod, więc nie wywołuj tego w głównym wątku aplikacji.Prostym sposobem na asynchroniczne uruchamianie tego samego kodu bez blokowania interfejsu użytkownika jest użycie GCD:
To powiedziawszy, w rzeczywistych aplikacjach, jeśli chcesz mieć najlepszą jakość obsługi i uniknąć wielokrotnego pobierania tego samego obrazu, możesz chcieć mieć je nie tylko pobrane, ale także buforowane. Jest już sporo bibliotek, które działają bardzo płynnie i wszystkie są naprawdę łatwe w użyciu. Osobiście polecam Kingfisher :
I to wszystko
źródło
image.url
dowolny ciąg adresu URL, na stałe lub nie :)URLSession.dataTask
ponieważ wiele innych odpowiedzi tutaj już pokazuje, jak to zrobić, lepiej pozostawić różne opcje otwarte.Jeśli chcesz tylko załadować obraz (asynchronicznie!) - po prostu dodaj to małe rozszerzenie do szybkiego kodu:
I użyj tego w ten sposób:
źródło
cancel
przycisk, aby zatrzymać pobieranie. Czy masz pomysł, jak to zrobić za pomocą tej metody? Muszę dodać funkcję anulowania.Szybki 2,2 || Xcode 7.3
Zapewnia wiele funkcji, takich jak:
i bardzo łatwe do wdrożenia dla Twojej aplikacji
Krok 1 Zainstaluj strąki
Alamofire 3.3.x
AlamofireImage 2.4.x
Krok 2 zaimportuj i użyj
Otóż to!! zajmie się wszystkim
Ogromne podziękowania dla facetów Alamofire za ułatwienie życia iDevelopers;)
źródło
Xcode 8 • Swift 3
Odpowiedź Leo Dabusa jest niesamowita! Chciałem tylko zapewnić kompleksowe rozwiązanie funkcji:
źródło
Zawarłem kod najlepszych odpowiedzi na pytanie w pojedynczą klasę wielokrotnego użytku rozszerzającą UIImageView, abyś mógł bezpośrednio używać asynchronicznego ładowania UIImageView w swojej scenorysie (lub utworzyć je z kodu).
Oto moja klasa:
a oto jak go użyć:
źródło
Swift 4 ::
Spowoduje to wyświetlenie programu ładującego podczas ładowania obrazu. Możesz użyć NSCache, które tymczasowo przechowują obraz
Stosowanie:-
źródło
źródło
fatal error: unexpectedly found nil while unwrapping an Optional value
FYI: Dla swift-2.0 Xcode7.0 beta2
źródło
swift 3 z obsługą błędów
Z przedłużeniem
Wykorzystanie rozszerzenia
Z obsługą pamięci podręcznej
źródło
Swift 4: Prosty moduł ładujący dla małych obrazów (np. Miniatur), który używa NSCache i zawsze działa w głównym wątku:
Stosowanie:
źródło
class
.Będziesz chciał zrobić:
W Swift zastąpiły większość metod fabrycznych Celu C zwykłymi konstruktorami.
Widzieć:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
źródło
+(instancetype)[MyThing thingWithOtherThing:]
, nazwałbyś ją tak jakMyThing(otherThing: ...)
Swift.Swift 2 z uchwytem błędu i niestandardowym nagłówkiem żądania
Po prostu dodaj rozszerzenie do UIImageView:
A następnie użyj nowego,
imageFromUrl(urlString: String)
aby pobrać obrazStosowanie:
źródło
Szybki 4
Ta metoda pobierze obraz ze strony asynchronicznie i buforuje go:
W użyciu:
źródło
Swift 2.0:
1)
LUB
2) Dodaj tę metodę do VC lub Extension.
Stosowanie :
źródło
Github URL - https://github.com/onevcat/Kingfisher
źródło
Oto działający kod do ładowania / pobierania obrazu z adresu URL. NSCache automatycznie i wyświetl obraz zastępczy przed pobraniem i załaduj rzeczywisty obraz (kod Swift 4).
Użyj w ten sposób:
źródło
Metoda uzyskania obrazu, który jest bezpieczny i działa z Swift 2.0 i X-Code 7.1:
Następnie wywołaj tę metodę w następujący sposób:
Jeśli aktualizujesz widok obrazem, będziesz musiał użyć tego po „if sukces {”:
Ta ostatnia część jest potrzebna, jeśli używasz obrazu w interfejsie użytkownika, ponieważ połączenia sieciowe wymagają czasu. Jeśli spróbujesz zaktualizować interfejs użytkownika za pomocą obrazu bez wywoływania metody dispatch_async, jak wyżej, komputer będzie szukał obrazu podczas pobierania obrazu, stwierdzi, że nie ma go (jeszcze), i przejdzie tak, jakby nie było obrazu znaleziony. Umieszczenie kodu w zamknięciu zakończenia dispatch_async mówi komputerowi: „Idź, weź ten obraz, a kiedy skończysz, wypełnij ten kod”. W ten sposób będziesz mieć obraz, gdy kod zostanie wywołany i wszystko będzie działać dobrze.
źródło
Jeśli szukasz bardzo, bardzo prostej implementacji. (To działało dla mnie w Swift 2)
Zaimplementowałem w widoku tabeli z niestandardową komórką, która ma tylko obraz
źródło
Polecam korzystanie z biblioteki Kingfisher do asynchronicznego pobierania zdjęć. Najlepszą częścią korzystania z Kingfishera jest to, że domyślnie buforuje wszystkie pobrane obrazy z adresem URL obrazu jako identyfikatorem. Następnym razem, gdy poprosisz o pobranie obrazu z tym konkretnym UR1, załaduje go z pamięci podręcznej.
Stosowanie:
źródło
Możesz użyć kapsułki,
SDWebImage
aby osiągnąć to samo. Jest łatwy w użyciu. Tutaj możesz uzyskać dokumentację SDWebImageOto przykładowy kod
źródło
Brakuje tylko jednej rzeczy!
źródło
Odpowiedź Swift 2.x, która pobiera obraz do pliku (w przeciwieństwie do odpowiedzi Leo Dabusa, która przechowuje obraz w pamięci). Na podstawie odpowiedzi Leo Dabusa i Roba z Pobierz dane z NSURLSession DownloadTaskWithRequest z modułu obsługi zakończenia :
źródło
Swift 4.1 Stworzyłem funkcję, po prostu przekazuję adres URL obrazu, klucz pamięci podręcznej po wygenerowaniu obrazu ustaw go na blok zakończenia.
źródło
W mojej
Utils.swift
klasie utworzyłem prostą funkcję klasy do wywoływania tej metody, do której można łatwo uzyskać dostęp,classname.methodname
a obrazy są zapisywane w pamięci NSCache za pomocąImageCaching.swift
klasyHappy Codding. Twoje zdrowie:)
źródło
Swift 4.2 i AlamofireImage
Jeśli korzystanie z biblioteki nie stanowi problemu, możesz to zrobić za pomocą
AlamofireImage
. moje próbki pochodzą z GithubPrzykład symboli zastępczych:
ma wiele przydatnych funkcji i rozszerzeń do pracy z obrazami. od buforowania po skalowanie i zmianę rozmiaru, a nawet stosowanie filtrów na obrazie. jeśli obrazy są ważne w Twojej aplikacji, sugeruję skorzystanie z tej struktury i oszczędność czasu.
źródło
szybki 5
za korzystanie
źródło
Korzystając z Ascyimageview możesz łatwo załadować imageurl do imageview.
niech image1Url: URL = URL (ciąg: „(imageurl)” jako ciąg)! imageview.imageURL = image1Url
źródło
Ładowanie obrazu z serwera: -
Stosowanie :-
źródło
Dla lepszej wydajności
UITableView
lubUICollectionView
korzystania z lekkiej biblioteki Inteligentne leniwe ładowanie Możesz użyć tego leniwego ładowania, jeśli chcesz ładować obrazy z adresu asynchronicznegoInteligentne „Leniwe ładowanie” do
UICollectionView
lubUITableView
za pomocąNSOperation
iNSOperationQueue
na iOS Więc w tym projekcie możemy pobrać wiele obrazów w dowolnym widoku (UICollectionView
lubUITableView
), optymalizując wydajność aplikacji za pomocąOperation
iOperationQueue
dla współbieżności. Oto kluczowe punkty tego projektu Smart Lazy Loading: Tworzenie usługi pobierania obrazu. Określ priorytet pobierania na podstawie widoczności komórek.Klasa ImageDownloadService utworzy instancję singleton i będzie miała instancję NSCache do buforowania pobranych obrazów. Odziedziczyliśmy klasę Operation do TOperation, aby dostosować funkcjonalność do naszych potrzeb. Myślę, że właściwości podklasy operacji są dość jasne pod względem funkcjonalności. Monitorujemy zmiany operacyjne operacji za pomocą KVO.
źródło