一個簡單的關於頁面,有一個圖片,版本號,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