一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例.html
这是系列文章的最后一篇.今天抽空写下,收下尾.文章自己会在第四篇的基础上,简单扩充下代码,实如今线下载与重置更改的功能.react
若是能较为仔细地阅读前四篇文章,第五篇给出的示例,应当是能够理解为无足轻重的.可是,大多数时候,咱们更多的可能只是须要一个简易的解决方案,就是那种拿来就能够用的东西,那种咱们须要先能看到一个简要的示例来看下效果再解决是否再继续阅读的方案.如此,对于好久之后,因为各类缘由被搜索引擎或者其余文章的连接导向此系列文章的人来讲,他们可能更想看到一个简要的示例,来决定系列的文章,在他们那个时间点,是否依然有意义.ios
截止目前而言,我对博客记录自己的定位,依然是属于一个辅助思考的工具.当你看到这篇文章的时候,可能你已经在用Xcode9 Xcode10了,可能代码示例都已经跑不起来了,可是我相信每篇文章所展现的那些参考连接和自己所透漏出的某些思考,或许对于你仍然是有某种启发的.git
我须要先扩展下更新资源的方法,使其在更新完整后,能返回更新的结果,以便于我进行进一步的操做,如从新显示某个图片:github
+ (void)yf_updatePatchFrom:(NSString *) pathInfoUrlStr completionHandler:(void (^)(BOOL success, NSError * error))completionHandler { if ( ! completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing to do... }; } [self yf_fetchPatchInfo: pathInfoUrlStr completionHandler:^(NSDictionary *patchInfo, NSError *error) { if (error) { NSLog(@"fetchPatchInfo error: %@", error); completionHandler(NO, error); return; } NSString * urlStr = [patchInfo objectForKey: @"url"]; NSString * md5 = [patchInfo objectForKey:@"md5"]; NSString * oriMd5 = [[[NSUserDefaults standardUserDefaults] objectForKey: [self yf_sourcePatchKey]] objectForKey:@"md5"]; if ([oriMd5 isEqualToString:md5]) { // no update completionHandler(YES,nil); return; } [self yf_downloadFileFrom:urlStr completionHandler:^(NSURL *location, NSError *error) { if (error) { NSLog(@"download file url:%@ error: %@", urlStr, error); completionHandler(NO, error); return; } NSString * patchCachePath = [self yf_cachePathFor: md5]; [SSZipArchive unzipFileAtPath:location.path toDestination: patchCachePath overwrite:YES password:nil error:&error]; if (error) { NSLog(@"unzip and move file error, with urlStr:%@ error:%@", urlStr, error); completionHandler(NO, error); return; } /* update patch info. */ NSString * source_patch_key = [self yf_sourcePatchKey]; [[NSUserDefaults standardUserDefaults] setObject:patchInfo forKey: source_patch_key]; completionHandler(YES,nil); }]; }]; }
而后是一个自定义的在线更新的点击方法:shell
- (IBAction)onlineUpdate:(id)sender { __weak ViewController * weakSelf = self; [UIImage yf_updatePatchFrom:@"https://raw.githubusercontent.com/ios122/ios_assets_hot_update/master/res/patch_04.json" completionHandler:^(BOOL success, NSError *error) { UIImage * image = [UIImage yf_imageNamed:@"sub/sample"]; weakSelf.sampleImageView.image = image; }]; }
还须要一个自定义的reset方法,考虑到之后的扩展性和目前的须要,使其支持block传出操做结果:json
+ (void )yf_reset:(void (^)(BOOL success, NSError * error))completionHandler { if ( ! completionHandler) { completionHandler = ^(BOOL success, NSError * error){ // nothing to do... }; } [[NSUserDefaults standardUserDefaults] setObject:nil forKey: [self yf_sourcePatchKey]]; completionHandler(YES, nil); }
具体使用起来,就很简单,重置后,更新下图片便可:segmentfault
- (IBAction)reset:(id)sender { __weak ViewController * weakSelf = self; [UIImage yf_reset:^(BOOL success, NSError *error) { if (success) { UIImage * image = [UIImage yf_imageNamed:@"sub/sample"]; weakSelf.sampleImageView.image = image; }else { NSLog(@"reset error:%@", error); } }]; }
这是第二个系列文章."咱们应该相信大多数人们对于美好的东西是有鉴赏的能力" -- 若是能在这一点上达成共识,下面我说的,或许值得继续一读:react-native