AFN

2020-06-24  本文已影响0人  虫yu
    #import "AFNetworking.h"

    UIImageView *imgV = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imgV.contentMode = UIViewContentModeScaleAspectFit;
    [self.view addSubview:imgV];
    
    NSString *urlStr = @"https://cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png";
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    [manager GET:urlStr parameters:nil headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"进度-%@", downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@-%@", task, responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error = %@", error);
    }];

报错

error = Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: image/png" UserInfo={NSLocalizedDescription=Request failed: unacceptable content-type: image/png, NSErrorFailingURLKey=https://cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png, com.alamofire.serialization.response.error.data={length = 1500, bytes = 0x89504e47 0d0a1a0a 0000000d 49484452 ... 49454e44 ae426082 }, com.alamofire.serialization.response.error.response= ......

修改

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 使用NSSet返回一个无序的序列化器
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/png", nil];
    [manager GET:urlStr parameters:nil headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"进度-%@", downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@-%@", task, responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error = %@", error);
    }];

报错

error = Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

修改

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 使用NSSet返回一个无序的序列化器
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/png", nil];
    [manager GET:urlStr parameters:nil headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"进度-%@", downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@-%@", task, responseObject);
        // 把图片显示出来
        imgV.image = [UIImage imageWithData:responseObject];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error = %@", error);
    }];

控制台打印:

LocalDataTask <FCDF08EF-7EBB-4A10-9DA5-5A153C0A2485>.<1>-{length = 1500, bytes = 0x89504e47 0d0a1a0a 0000000d 49484452 ... 49454e44 ae426082 }

查看当前线程

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 使用NSSet返回一个无序的序列化器
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/png", nil];
    [manager GET:urlStr parameters:nil headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"进度-%@", downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"%@-%@", task, responseObject);
        NSLog(@"当前线程:%@", [NSThread currentThread]);
        // 异步
        imgV.image = [UIImage imageWithData:responseObject];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error = %@", error);
    }];

控制台

当前线程:<NSThread: 0x600001df9040>{number = 1, name = main}

AFN内部处理了,最后的block会在主线程回调

简化修改

//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//    // 使用NSSet返回一个无序的序列化器
//    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/png", nil];
    manager.responseSerializer = [AFImageResponseSerializer serializer];

报错

-[UIImage length]: unrecognized selector sent to instance 0x600000eacab0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage length]: unrecognized selector sent to instance 0x600000eacab0'

修改

// imgV.image = [UIImage imageWithData:responseObject];
imgV.image = responseObject;

控制台

LocalDataTask <9CCD6132-221F-4D44-B45D-BE95AEC8109F>.<1>-<UIImage:0x600002ed46c0 anonymous ... ...
当前线程:<NSThread: 0x6000009d40c0>{number = 1, name = main}

修改

#import "UIKit+AFNetworking.h"
    UIImageView *imgV = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imgV.contentMode = UIViewContentModeScaleAspectFit;
    [self.view addSubview:imgV];
    
    NSString *urlStr = @"https://cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png";
    [imgV setImageWithURL:[NSURL URLWithString:urlStr] placeholderImage:nil];

框架的设计


image.png
#import "AFAutoPurgingImageCache.h"

@interface AFCachedImage : NSObject

@property (nonatomic, strong) UIImage *image;
@property (nonatomic, copy) NSString *identifier;// 方便找到
@property (nonatomic, assign) UInt64 totalBytes;// 
@property (nonatomic, strong) NSDate *lastAccessDate;
@property (nonatomic, assign) UInt64 currentMemoryUsage;

@end
上一篇下一篇

猜你喜欢

热点阅读