Pytanie AFNetworking setImageWithURLRequest nie ustawia zdalnego obrazu


Używam AFNetworking's UIImageView+AFNetworking.h asynchronicznie ładować obraz online na UIImageView.

Zdalny obraz ładuje się bardzo dobrze, gdy używam setImageWithURLRequest:, ale kiedy spróbuję użyć setImageWithURLRequest:placeholderImage:success:failure zdalny obraz zostanie pobrany, ale UIImageView nie ustawi go jako jego UIImage.

Oto mój kod:

@property (strong) IBOutlet UIImageView *imageView;

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    [_imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://i.imgur.com/fVhhR.png"]]
                       placeholderImage:nil
                                success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image ){
                                    NSLog(@"Loaded successfully: %d", [response statusCode]);
                                }
                                failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){
                                    NSLog(@"failed loading: %@", error);
                                }
     ];
}

Obraz zawsze ładuje się pomyślnie, kod statusu jest zawsze 200. Ale muszę dodać [_imageView setImage:image]; do success blok dla UIImageView aby ustawić obraz.

Używam iOS 6.0

Jakieś pomysły?


17
2017-11-12 16:08


pochodzenie




Odpowiedzi:


Jeśli podasz blok sukcesu, to jesteś odpowiedzialny za ustawienie właściwości obrazu twojego UIImageView. Jeśli dostarczysz zerowy blok sukcesu, AFNetworking zrobi to za ciebie.

To jest odpowiednia sekcja UIImageView+AFNetworking.m (linia 117):

if (success) {
    success(operation.request, operation.response, responseObject);
} else {
    self.image = responseObject;
}

Alternatywnie, po prostu użyj -setImageWithURL:placeholderImage: bez bloków ukończenia.


29
2017-11-12 16:42



To jest poprawna odpowiedź, ale pomyślałem, że mogę dodać do tego: Ta zmiana została wprowadzona niedawno dla wersji 1.0.1, aby programiści mogli określić przejście w razie potrzeby lub przeprowadzić jakieś przetwarzanie. Jest to udokumentowane w CHANGES i jest teraz również dostępne w dokumentacji witryny. Zmiana została dokonana tutaj: github.com/AFNetworking/AFNetworking/commit/... - Steven Fisher


Miałem ten sam problem i po sfrustrowaniu dokumentami do biblioteki znalazłem to, co wspomniała Robin. Więc teraz używam:

[imageView setImageWithURLRequest:imageRequest placeholderImage:nil success:nil failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
    NSLog(@"Unable to retrieve image");
}];

Działa jak marzenie. Mam nadzieję, że to pomoże.


2
2017-07-16 18:28





Dokument jest bardzo jasny:

Jeśli zostanie określony blok sukcesu, jest to odpowiedzialność bloku   aby ustawić obraz widoku obrazu przed powrotem. Jeśli nie ma sukcesu   jest określony, domyślny sposób ustawiania obrazu za pomocą    self.image = image jest stosowany.

Możesz więc albo przekazać zerowy blok do sukcesu (jak wspomniano powyżej), albo zadzwonić do setImage: sam obraz, jeśli określisz blok


2
2018-04-08 06:52





W swoim bloku sukcesu musisz podać UIImaage *image dla Twojej UIImageView. Zakładam, że dostajesz NSLog(@"Loaded successfully: %d", [response statusCode]);

Ponadto wygląda na to, że masz obraz zastępczy nil. Czy nie chcesz zastępować obrazu zastępującego obraz ładujący?


1
2017-11-12 16:23



AFNetworking dokumentacja dla UIImageView+AFNetworking.h stwierdza, że ​​"Jeśli obraz jest buforowany lokalnie, obraz jest ustawiany natychmiast, w przeciwnym razie określony obraz zastępczy zostanie ustawiony natychmiast, a następnie zdalny obraz zostanie ustawiony po zakończeniu żądania." W moim przypadku nie jest on buforowany lokalnie, więc powinien zostać ustawiony natychmiast, a nie jest. Ustawiłem obraz zastępczy na zero, ale to nie powinno mieć znaczenia ... - Eric
Zobacz moją odpowiedź poniżej - dokumentacja jest niejasna. Spójrz na kod źródłowy. - Robin Summerhill
Dokumentacja nie jest tak "niejasna" jak "przestarzała". Zachowanie się zmieniło, dokumentacja nie została ponownie przesłana. - Steven Fisher


Dla tych, którzy natknęli się na ten problem i dostali się tutaj podczas przeglądania i wyszukiwania w Internecie, oto kolejny powód - obraz może mieć nieprawidłowe rozszerzenie pliku. Na przykład obraz może być zapisany jako jpg, ale ktoś postanowił zmienić jego rozszerzenie na png.

Oto, jak to sprawdzić: najpierw musisz użyć narzędzia do monitorowania sieci (na przykład Charlie) i sprawdzić nagłówek HTTP "Content-Type" żądania obrazu. Załóżmy, że ma wartość "image / png". Oznacza to, że obraz z backendu ma rozszerzenie pliku png. Teraz uruchom aplikację na symulatorze, a następnie przejdź do folderu symulatora swojej aplikacji:

/ Users / you / Library / Application Support / Symulator iPhone'a / wybierz-folder-z-twoją-wersją iOS / Applications / YourApp / Library / Caches / yourAppBundleId / fsCachedData /

Znajdź plik obrazu i dodaj do tego pliku rozszerzenie png lub jpg (AFNetworking buforuje pliki graficzne bez rozszerzenia pliku, więc musisz dodać je, aby otworzyć je za pomocą Podglądu). Otwórz go za pomocą Preview i naciśnij Tools / Show Inspector. Sprawdź "Typ dokumentu" w otwartym panelu. Jeśli jest inny niż "obraz PNG" (na przykład obraz JPEG), to jest to przyczyna i musisz sam naprawić obraz na zapleczu - otwórz go odpowiednim programem do edycji i zapisz jako PNG.


1
2018-06-30 10:44