当前位置: 首页 > article >正文

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

知乎日报仿写

  • 前言
  • 效果
    • Manager封装网络请求
    • 线程冲突问题
    • 下拉刷新
    • 添加网络请求的图片
    • 通过时间戳和日期格式化获取时间
  • 总结

前言

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


效果

请添加图片描述

请添加图片描述

Manager封装网络请求

知乎日报的仿写需要频繁的申请网络请求,将所有的网络请求封装成一个Manager类可以有效减少代码量,并且优化数据的使用。
具体内容在往期博客中,使用单例类进行网络请求「iOS」——AFNetworking的简单使用

此处,需要注意使用数据时,要将模型转为字典,需要在Model层自己写转换的方法。

线程冲突问题

这里我使用AFNetwokring第三方库来实现网络请求,AFNetworking 通过 NSURLSession 将所有的网络请求放入后台线程进行处理。此时就会出现线程问题。具体的问题就是

-(void) GetScrollerModel
{
    self.str_date = [DateModel getCurrentDateString];
    NSLog(@"%@",self.str_date);
    [[Manger sharedSingleton] NetWorkWithScroller:^(ScrollerModel *Model_Scroller) {
        
        self.dict_Scroller = [Model_Scroller ModelToDict:Model_Scroller];
        
        for(int i = 0; i < 5; i++) {
            [self.array_Scroller_ID addObject: self.dict_Scroller[@"top_stories"][i][@"id"]];
            [self.array_Scroller_URL addObject:self.dict_Scroller[@"top_stories"][i][@"url"]];
            [self.array_Scroller_Image addObject:self.dict_Scroller[@"top_stories"][i][@"image"]];
            [self.array_Scroller_title addObject:self.dict_Scroller[@"top_stories"][i][@"title"]];
            [self.array_Scroller_hint addObject:self.dict_Scroller[@"top_stories"][i][@"hint"]];
        }
        
        self.dict_data = [Model_Scroller ModelToDict:Model_Scroller];
        [self.array_data addObject:self.dict_data];
        } andError:^(NSError *error) {
            NSLog(@"GetScrollerModel错误:%@",error);
        }];
[[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
            self.dict_data = [Model ModelToDict:Model];
            NSLog(@"dice:%@",self.dict_data[@"stories"][1][@"hint"]);
            [self.array_data addObject:self.dict_data];
            
            } andError:^(NSError *error) {
                NSLog(@"CellModel错误:%@",error);
            } andNSString:(NSString *)self.str_date];
    [self setupTableView];
}

我在此进行网络数据请求时,数组的第一项可能是第一个网络请求的,也可能是第二个网络请求的。并且更新UI的实际也不确定,会导致程序崩溃。
我通过如下方法:将第二个网络申请嵌套在第一个内,并通过GCD保证线程安全。

-(void) GetScrollerModel
{
    self.str_date = [DateModel getCurrentDateString];
    NSLog(@"%@",self.str_date);
    [[Manger sharedSingleton] NetWorkWithScroller:^(ScrollerModel *Model_Scroller) {
        
        self.dict_Scroller = [Model_Scroller ModelToDict:Model_Scroller];
        
        for(int i = 0; i < 5; i++) {
            [self.array_Scroller_ID addObject: self.dict_Scroller[@"top_stories"][i][@"id"]];
            [self.array_Scroller_URL addObject:self.dict_Scroller[@"top_stories"][i][@"url"]];
            [self.array_Scroller_Image addObject:self.dict_Scroller[@"top_stories"][i][@"image"]];
            [self.array_Scroller_title addObject:self.dict_Scroller[@"top_stories"][i][@"title"]];
            [self.array_Scroller_hint addObject:self.dict_Scroller[@"top_stories"][i][@"hint"]];
        }
        
        self.dict_data = [Model_Scroller ModelToDict:Model_Scroller];
        [self.array_data addObject:self.dict_data];
        
        
        [[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
            self.dict_data = [Model ModelToDict:Model];
            NSLog(@"dice:%@",self.dict_data[@"stories"][1][@"hint"]);
            [self.array_data addObject:self.dict_data];
            
            dispatch_async(dispatch_get_main_queue(), ^{

                [self setupTableView];

            });
            
            } andError:^(NSError *error) {
                NSLog(@"CellModel错误:%@",error);
            } andNSString:(NSString *)self.str_date];
        } andError:^(NSError *error) {
            NSLog(@"GetScrollerModel错误:%@",error);
        }];

}

下拉刷新

上述代码强调加入数组的顺序,与此处下拉刷新有关。我下拉刷新的逻辑是通过调用-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate方法。判断当前下滑是否下滑到底。设立一个falg全局变量,如果到底就使flag++,然后根据数组上一个的date数据的Date进行网络请求。这里添加进入数组的顺序关系到网络请求的顺序,因此一定要保证是按顺序加入。

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    NSString *str_new = self.array_data[1+_falg][@"date"];
    if(scrollView.contentOffset.y > self.tableView_First.contentSize.height - self.view.bounds.size.height - 50) {
        
        [[Manger sharedSingleton] NetWorkWithTheme:^(CellModel *Model) {
            
            [self.array_data addObject:[Model ModelToDict:Model]];
            
            self.falg ++;
            [self.tableView_First reloadData];
                } andError:^(NSError *error) {
                    NSLog(@"xialaerror:%@",error);
                } andNSString:(NSString *) str_new];       
    }
}

添加网络请求的图片

知乎日报的API的图片是通过URL地址保存,因此这里通过SDWebImage库来进行使用,这个库可以通过图片URL将图片加载到指定的UI控件上。此处只用到如下代码:

NSString *str_url = self.array_data[current][@"stories"][indexPath.row][@"images"][0];
        [cell.imagView_Small sd_setImageWithURL:[NSURL URLWithString:str_url]
                         placeholderImage:[UIImage imageNamed:@"placeholder"]];

通过时间戳和日期格式化获取时间

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

  • 精确性:能够避免因时区变化引起的问题。
  • 通用性:时间戳可以在不同系统之间传递并且易于存储,因为它是一个简单的数字。
  • 方便进行时间计算:时间戳可以直接用于时间的加减运算,适合需要进行复杂时间计算的场景。
#import <Foundation/Foundation.h>

@interface DateModel : NSObject

+(NSString *)getCurrentDateString;
+(NSString *)getMonthWithDateString;

+(NSTimeInterval)getTimestampWithTimeString: (NSString *) timeString;
+(NSString *)getDateWithTimeString:(NSString *) timeString;
+(NSString *)getMouthWithTimeString:(NSString *) timeString;
+(NSString *)getDayWithTimeString:(NSString *) timeString;
+(NSString *)getBeforeDateWithTimeString:(NSString *) timeString;

@end

但是时间戳写起来略微有点麻烦,直接使用NSDateFormatter日期格式化代码更简便。

//时间戳形式
+(NSTimeInterval)getTimestampWithTimeString:(NSString *)timeString
{
    NSDateFormatter *dateFirmatter = [[NSDateFormatter alloc] init];
    [dateFirmatter setDateFormat:@"YYYYMMdd"];
    
    NSDate *date = [dateFirmatter dateFromString:timeString];
    
    NSTimeInterval timeStamp = [date timeIntervalSince1970];
    return timeStamp;
}

//通过日期格式化
+(NSString*)getCurrentDateString
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"YYYYMMdd"];
    return [dateFormatter stringFromDate:[NSDate date]];
}


总结

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


http://www.kler.cn/a/378839.html

相关文章:

  • 【OpenGL】vs中glsl高亮显示插件
  • utf-8、pbkdf2_sha
  • 【Java设计模式】16-26章
  • CTF和渗透测试中可用命令直接安装的工具(自用)
  • H5页面在线预览pdf
  • CytoSPACE·空转和单细胞数据的高分辨率比对
  • STL学习-关联容器-pair数对
  • 新老项目不同node版本,使用nvm控制node版本切换(mac、window)
  • Excel菜单选项无法点击?两种原因及解决方法全解析
  • 《Python 练习一百题:提升编程技能的宝藏》
  • 重生之我在Java世界------学工厂设计模式
  • Transformer 架构简单理解;GPT-3.5 的架构,向量长度为 :12288;Transformer架构改进:BERT和GPT
  • git创建一个公共子模块用于不同的项目共享这一个子模块
  • JWT-混淆算法
  • 鸿蒙HarmonyOS应用开发者(基础+高级)认证
  • uniapp下载文件的方案,包括H5,App方案解决办法
  • 如何使用Python WebDriver爬取ChatGPT内容(完整教程)
  • 数据结构,问题 C: 后缀表达式
  • Java NIO 【处理消息边界】
  • 基于 Spring Boot 和 Vue 的大学生入伍管理创新系统
  • CSS中display和visibility的区别
  • pnpm install安装element-plus的版本跟package.json指定的版本不一样
  • Hive SQL 和 SQL 的区别总结(持续更新中.....)
  • UV紫外相机
  • 在 C/C++ 之中为什么应该建议使用C函数库定义的基础数值类型,而不是编译默认的关键字类型?
  • Javase——正则表达式