「iOS」——知乎日报一二周总结

[复制链接]
发表于 2024-11-4 07:17:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前言

前两周内容的仿写,主要完成了首页的仿写,进度稍慢。

效果



Manager封装网络请求

知乎日报的仿写须要频繁的申请网络请求,将全部的网络请求封装成一个Manager类可以有效镌汰代码量,并且优化数据的使用。
具体内容在往期博客中,使用单例类进行网络请求「iOS」——AFNetworking的简单使用
此处,须要注意使用数据时,要将模子转为字典,须要在Model层自己写转换的方法。
线程辩论问题

这里我使用AFNetwokring第三方库来实现网络请求,AFNetworking 通过 NSURLSession 将全部的网络请求放入后台线程进行处置惩罚。此时就会出现线程问题。具体的问题就是
  1. -(void) GetScrollerModel
  2. {
  3.     self.str_date = [DateModel getCurrentDateString];
  4.     NSLog(@"%@",self.str_date);
  5.     [[Manger sharedSingleton] NetWorkWithScroller:^(ScrollerModel *Model_Scroller) {
  6.         
  7.         self.dict_Scroller = [Model_Scroller ModelToDict:Model_Scroller];
  8.         
  9.         for(int i = 0; i < 5; i++) {
  10.             [self.array_Scroller_ID addObject: self.dict_Scroller[@"top_stories"][i][@"id"]];
  11.             [self.array_Scroller_URL addObject:self.dict_Scroller[@"top_stories"][i][@"url"]];
  12.             [self.array_Scroller_Image addObject:self.dict_Scroller[@"top_stories"][i][@"image"]];
  13.             [self.array_Scroller_title addObject:self.dict_Scroller[@"top_stories"][i][@"title"]];
  14.             [self.array_Scroller_hint addObject:self.dict_Scroller[@"top_stories"][i][@"hint"]];
  15.         }
  16.         
  17.         self.dict_data = [Model_Scroller ModelToDict:Model_Scroller];
  18.         [self.array_data addObject:self.dict_data];
  19.         } andError:^(NSError *error) {
  20.             NSLog(@"GetScrollerModel错误:%@",error);
  21.         }];
  22. [[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
  23.             self.dict_data = [Model ModelToDict:Model];
  24.             NSLog(@"dice:%@",self.dict_data[@"stories"][1][@"hint"]);
  25.             [self.array_data addObject:self.dict_data];
  26.             
  27.             } andError:^(NSError *error) {
  28.                 NSLog(@"CellModel错误:%@",error);
  29.             } andNSString:(NSString *)self.str_date];
  30.     [self setupTableView];
  31. }
复制代码
我在此进行网络数据请求时,数组的第一项大概是第一个网络请求的,也大概是第二个网络请求的。并且更新UI的现实也不确定,会导致程序崩溃。
我通过如下方法:将第二个网络申请嵌套在第一个内,并通过GCD保证线程安全。
  1. -(void) GetScrollerModel
  2. {
  3.     self.str_date = [DateModel getCurrentDateString];
  4.     NSLog(@"%@",self.str_date);
  5.     [[Manger sharedSingleton] NetWorkWithScroller:^(ScrollerModel *Model_Scroller) {
  6.         
  7.         self.dict_Scroller = [Model_Scroller ModelToDict:Model_Scroller];
  8.         
  9.         for(int i = 0; i < 5; i++) {
  10.             [self.array_Scroller_ID addObject: self.dict_Scroller[@"top_stories"][i][@"id"]];
  11.             [self.array_Scroller_URL addObject:self.dict_Scroller[@"top_stories"][i][@"url"]];
  12.             [self.array_Scroller_Image addObject:self.dict_Scroller[@"top_stories"][i][@"image"]];
  13.             [self.array_Scroller_title addObject:self.dict_Scroller[@"top_stories"][i][@"title"]];
  14.             [self.array_Scroller_hint addObject:self.dict_Scroller[@"top_stories"][i][@"hint"]];
  15.         }
  16.         
  17.         self.dict_data = [Model_Scroller ModelToDict:Model_Scroller];
  18.         [self.array_data addObject:self.dict_data];
  19.         
  20.         
  21.         [[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
  22.             self.dict_data = [Model ModelToDict:Model];
  23.             NSLog(@"dice:%@",self.dict_data[@"stories"][1][@"hint"]);
  24.             [self.array_data addObject:self.dict_data];
  25.             
  26.             dispatch_async(dispatch_get_main_queue(), ^{
  27.                 [self setupTableView];
  28.             });
  29.             
  30.             } andError:^(NSError *error) {
  31.                 NSLog(@"CellModel错误:%@",error);
  32.             } andNSString:(NSString *)self.str_date];
  33.         } andError:^(NSError *error) {
  34.             NSLog(@"GetScrollerModel错误:%@",error);
  35.         }];
  36. }
复制代码
下拉革新

上述代码夸大加入数组的次序,与此处下拉革新有关。我下拉革新的逻辑是通过调用-(void)scrollViewDidEndDraggingUIScrollView *)scrollView willDecelerateBOOL)decelerate方法。判断当前下滑是否下滑到底。设立一个falg全局变量,如果到底就使flag++,然后根据数组上一个的date数据的Date进行网络请求。这里添加进入数组的次序关系到网络请求的次序,因此一定要保证是按次序加入。
  1. -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
  2. {
  3.     NSString *str_new = self.array_data[1+_falg][@"date"];
  4.     if(scrollView.contentOffset.y > self.tableView_First.contentSize.height - self.view.bounds.size.height - 50) {
  5.         
  6.         [[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
  7.             
  8.             [self.array_data addObject:[Model ModelToDict:Model]];
  9.             
  10.             self.falg ++;
  11.             [self.tableView_First reloadData];
  12.                 } andError:^(NSError *error) {
  13.                     NSLog(@"xialaerror:%@",error);
  14.                 } andNSString:(NSString *) str_new];      
  15.     }
  16. }
复制代码
添加网络请求的图片

知乎日报的API的图片是通过URL所在生存,因此这里通过SDWebImage库来进行使用,这个库可以通过图片URL将图片加载到指定的UI控件上。此处只用到如下代码:
  1. NSString *str_url = self.array_data[current][@"stories"][indexPath.row][@"images"][0];
  2.         [cell.imagView_Small sd_setImageWithURL:[NSURL URLWithString:str_url]
  3.                          placeholderImage:[UIImage imageNamed:@"placeholder"]];
复制代码
通过期间戳和日期格式化获取时间

我们既可以通过NSDateFormatter获取时间,也可以通过期间戳来获取时间。
时间戳获取时间:将时间字符串解析为NSDate对象,并通过自1970年1月1日以来的秒数来获取时间信息。
通过期间戳获取时间的优点有:


  • 精确性:可以或许克制因时区厘革引起的问题。
  • 通用性:时间戳可以在不同系统之间传递并且易于存储,因为它是一个简单的数字。
  • 方便进行时间盘算:时间戳可以直接用于时间的加减运算,适合须要进行复杂时间盘算的场景。
  1. #import <Foundation/Foundation.h>
  2. @interface DateModel : NSObject
  3. +(NSString *)getCurrentDateString;
  4. +(NSString *)getMonthWithDateString;
  5. +(NSTimeInterval)getTimestampWithTimeString: (NSString *) timeString;
  6. +(NSString *)getDateWithTimeString:(NSString *) timeString;
  7. +(NSString *)getMouthWithTimeString:(NSString *) timeString;
  8. +(NSString *)getDayWithTimeString:(NSString *) timeString;
  9. +(NSString *)getBeforeDateWithTimeString:(NSString *) timeString;
  10. @end
复制代码
但是时间戳写起来略微有点贫苦,直接使用NSDateFormatter日期格式化代码更轻便。
  1. //时间戳形式
  2. +(NSTimeInterval)getTimestampWithTimeString:(NSString *)timeString
  3. {
  4.     NSDateFormatter *dateFirmatter = [[NSDateFormatter alloc] init];
  5.     [dateFirmatter setDateFormat:@"YYYYMMdd"];
  6.    
  7.     NSDate *date = [dateFirmatter dateFromString:timeString];
  8.    
  9.     NSTimeInterval timeStamp = [date timeIntervalSince1970];
  10.     return timeStamp;
  11. }
  12. //通过日期格式化
  13. +(NSString*)getCurrentDateString
  14. {
  15.     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  16.     [dateFormatter setDateFormat:@"YYYYMMdd"];
  17.     return [dateFormatter stringFromDate:[NSDate date]];
  18. }
复制代码

总结

首页的大部分已经完成,正在写单位格点击的响应变乱。进度较慢,下星期尽量多写些。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表