Подтвердить что ты не робот

Показать UIActivityIndicator с AFNetworking SetImageWithURL

Я использую библиотеку AFNetworking для установки изображений с содержимым URL-адресов. В следующем примере topLeftImage является экземпляром UIImageView.

[topLeftImage setImageWithURL:[NSURL URLWithString:imageURL]];

Что я хотел бы сделать, так это показать UIActivityIndicatorView во время загрузки изображения. Однако я не могу понять, где инициировать запуск и остановку индикатора активности. Ниже приведен код моего индикатора активности.

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[topLeftImage addSubview:activityIndicator];
[activityIndicator startAnimating];

Как связать приведенный выше код с методом setImageWithURL, чтобы индикатор активности отображался только во время загрузки изображения?

4b9b3361

Ответ 1

Категория UIImageView + AFNetworking.h предоставляет метод setImageWithURL, который позволяет использовать блоки успеха и отказа. Эти блоки будут выполняться после успешного завершения запроса или неудачи. Таким образом, вы можете запустить анимацию непосредственно перед запросом и положить стоп в успех и завершить блокировку. Это пример кода:

NSURL *imageURL = [NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg/402px-Mona_Lisa%2C_by_Leonardo_da_Vinci%2C_from_C2RMF_retouched.jpg"];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL];
[_activityIndicator setHidden:NO];
[_activityIndicator startAnimating];
[_imageView setImageWithURLRequest:imageRequest
                  placeholderImage:nil
                           success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
 {
     [_activityIndicator setHidden:YES];
     [_activityIndicator stopAnimating];
     _imageView.image = image;
 }
                           failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
 {
     [_activityIndicator setHidden:YES];
     [_activityIndicator stopAnimating];
 }];

Ответ 2

Простой extension для UIImageView в Swift:

extension UIImageView {

    func setImageWithString(string: String?) {

        if let string = string, let url = NSURL(string: string) {

            let activityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)))
            activityIndicatorView.hidden = false
            activityIndicatorView.color = UIColor.lightGrayColor()

            addSubview(activityIndicatorView)
            bringSubviewToFront(activityIndicatorView)

            activityIndicatorView.startAnimating()

            setImageWithURLRequest(NSURLRequest(URL: url), placeholderImage: nil, success: { request, response, image in

                self.image = image
                activityIndicatorView.hidden = true
                activityIndicatorView.stopAnimating()
                activityIndicatorView.removeFromSuperview()

                }, failure: { request, response, error in

                    activityIndicatorView.hidden = true
                    activityIndicatorView.stopAnimating()
                    activityIndicatorView.removeFromSuperview()
            })
        }
    }
}

Ответ 3

Основываясь на ответе Луиса Эспиноза, я сделал эту маленькую категорию, надеюсь, это поможет. Я просто создаю и добавляю UIActivityIndicatorView, если в представлении отсутствует изображение.

#import <UIImageView+AFNetworking.h>
@implementation UIImageView (LDToolbox)
- (void)loadFromUrl:(NSURL *)url errorImage:(UIImage *)errorImage {


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
    __weak UIImageView *weakSelf = self; // Always use weak in Blocks

    [[self subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; // Remove previous that not stop

    __block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] init];
    activityIndicator.frame = self.bounds;
    [self addSubview:activityIndicator];
    [activityIndicator setHidden:NO];
    [activityIndicator startAnimating];


    void (^removeSpinner)(void) = ^{ // Desctuctor Block
        if (activityIndicator) {
            [activityIndicator setHidden:YES];
            [activityIndicator stopAnimating];
            [activityIndicator removeFromSuperview];
            activityIndicator = nil;
        }
    };

    [self setImageWithURLRequest:request placeholderImage:nil success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
        removeSpinner();
        weakSelf.image = image;
    } failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
        removeSpinner();
        NSLog(@"failed loading [%@]: %@", url, error);
        weakSelf.image = errorImage;
    }];
}    
@end