|
1 | 1 | # 网络层回访 |
| 2 | + |
| 3 | +还有一个机会来进一步接受我们函数反应型编程的理念,那就是我们的网络层 `FRPPhotoImporter`,我们先来看看下载图片的方法: |
| 4 | + |
| 5 | +``` |
| 6 | ++ (void)downloadThumbnailForPhotoModel:(FRPPhotoModel *)photoModel { |
| 7 | + [self download:photoModel.thumbnailURL withCompletion:^(NSData *data) { |
| 8 | + photoModel.thumbnailData = data; |
| 9 | + }]; |
| 10 | +} |
| 11 | +
|
| 12 | ++ (void)downloadFullsizedImageForPhotoModel:(FRPPhotoModel *)photoModel { |
| 13 | + [self download:photoModel.fullsizedURL withCompletion:^(NSData *data){ |
| 14 | + photoModel.fullsizedData = data; |
| 15 | + }]; |
| 16 | +} |
| 17 | +
|
| 18 | ++ (void)download:(NSString *)urlString withCompletion:(void (^)(NSData *data))completion { |
| 19 | + NSAssert(urlString, @"URL must not be nil"); |
| 20 | + |
| 21 | + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; |
| 22 | + [NSURLConnection sendAsynchronousRequest:request |
| 23 | + queue:[NSOperationQueue mainQueue] |
| 24 | + completionHandler: |
| 25 | + ^(NSURLResponse *response, NSData *data, NSError *connectionError) { |
| 26 | + if(completion) { |
| 27 | + completion(data); |
| 28 | + } |
| 29 | + }]; |
| 30 | +} |
| 31 | +
|
| 32 | +``` |
| 33 | +Completion blocks?这是另外一个使用Signals的机会。更深入一点来说,我们可以使用`NSURLConnection`的ReactiveCocoa的扩展。下面我们来重写上面的方法: |
| 34 | + |
| 35 | +``` |
| 36 | ++ (void)downloadThumbnailForPhotoModel:(FRPPhotoModel *)photoModel { |
| 37 | + RAC(photoModel, thumbnailData) = [self download:photoModel.thumbnailURL]; |
| 38 | +} |
| 39 | +
|
| 40 | ++ (void)downloadFullsizedImageForPhotoModel:(FRPPhotoModel *)photoModel { |
| 41 | + RAC(photoModel,fullsizedData) = [self download:photoModel.fullsizedURL]; |
| 42 | +} |
| 43 | +
|
| 44 | ++ (RACSignal *)download:(NSString *)urlString { |
| 45 | + NSAssert(urlString , @"URL must not be nil"); |
| 46 | + |
| 47 | + NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: urlString]]; |
| 48 | + |
| 49 | + return [[[NSURLConnection rac_sendAsynchronousRequest:request] |
| 50 | + map:^id (RACTuple *value) { |
| 51 | + return [value second]; |
| 52 | + }] deliverOn:[RACScheduler mainThreadScheduler]]; |
| 53 | +} |
| 54 | +
|
| 55 | +``` |
| 56 | +这里有两个大的不同: |
| 57 | + |
| 58 | + 1. asdf |
| 59 | + 2. asdf |
0 commit comments