「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.mzph.cn/diannao/59082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Profinet、Ethernet/IP 工业以太网无线通信解决方案

在工业现场&#xff0c;我们常常会面临这样的困扰&#xff1a;两个PLC之间、PLC 跟远程IO之间或者PLC 跟伺服之间由于种种原因不方便布线&#xff0c;严重影响了通讯效率和生产进程。为了解决这一难题&#xff0c;三格电子设计了一款工业以太网无线网桥&#xff0c;这款无线网桥…

【数据结构】二叉树——前中后序遍历

一、如何遍历二叉树 以图上这个二叉树作为例子&#xff0c;我们若想要访问二叉树中每一个元素 我们一般是采用递归的方式 比如我们要访问完整个二叉树&#xff0c;我们进行递归先访问根的左子树&#xff0c;然后因为递归再次调用&#xff0c;我们会先一直访问二叉树左子树&…

桑基图在医学数据分析中的更复杂应用示例

桑基图&#xff08;Sankey Diagram&#xff09;能够有效地展示复杂的流动关系&#xff0c;特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来&#xff0c;我们将构建一个稍微复杂的示例&#xff0c;展示不同疾病患者在治疗过程中的流动&#xff0c;以及他们的治…

WPS 表格奇数行或偶数行填充颜色(Excel也适用)

今天在做项目测试用例&#xff0c;全都是白色底纹&#xff0c;日以继夜的赶项目 大家都头脑不清晰了&#xff0c;看着容易错行&#xff0c;看我一键更新 如本次测试用例&#xff0c;单元格区域的奇数行填充灰色。 点击单元格最左上角选定区域&#xff0c;然后依次点击【开始】…

RT-DETR:替代YOLO的更快实时对象检测模型(附代码)

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…

ComfyUI - ComfyUI 工作流中集成 SAM2 + GroundingDINO 处理图像与视频 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143359538 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SAM2 与…

Android13预置应用及授权开发

在android13中&#xff0c;要预置一个对讲应用&#xff0c;从预置和授权&#xff0c;梳理了一下&#xff0c;以便后续查询使用。在此记录 一放置应用 我的apk应用放在vendor下面&#xff0c; 路径&#xff1a;projectroot/vendor/fly/package/apps/DMR/flydmr.apk (vendor/fl…

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点&#xff1f; 1.1 Spring…

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 持续更新&#xff0c;欢迎关注!!! 基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 随着人民生活质量的提高和生活节奏的加快&#xff0c;人体健康监测成为全球关注的焦点之一。基于物联网的人体…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章&#xff0c;主要介绍如何巧用汉字笔画生成与汉字搜索插件&#xff0c;打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt &#xff08;1&#xff09;角色和目标 &#xff08;2&#xff09;思考路径 …

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章&#xff0c;提出了一个新的网络结构ECMA&#xff0c;从实验结果上看在超分&#xff0c;去噪&#xff0c;去模糊…

Python | Leetcode Python题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxLength(self, nums: List[int]) -> int:# 前缀和字典: key为1的数量和0的数量的差值,value为对应坐标hashmap {0:-1}# 当前1的数量和0的数量的差值counter ans 0for i,num in enumerate(nums):# 每多一个1…

微服务架构深入理解 | 技术栈

微服务架构深入理解 | 技术栈 服务网关 服务网关是在微服务架构中扮演重要角色的组件&#xff0c;它是系统对外的入口&#xff0c;负责接收和处理客户端的请求&#xff0c;并将请求路由到相应的微服务。服务网关常常与API管理、负载均衡、安全认证、流量控制等功能结合&#xf…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

目标追踪DeepSort

一、卡尔曼滤波 你可以在任何对某个动态系统有 “不确定信息” 的地方使用卡尔曼滤波器&#xff0c;并且可以对系统下一步的行为做出 “有根据的猜测”。即使混乱的现实干扰了你所猜测的干净运动&#xff0c;卡尔曼滤波器通常也能很好地确定实际发生了什么。它还可以利用你可能…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶…

免费好用又好看且多端自动同步第三方终端工具Termius你值得拥有

使用目的&#xff1a; 本地终端功能一样&#xff0c;都是为了登录服务器查看日志等操作。 本地终端 优点&#xff1a;方便简单&#xff0c;无需额外下载安装、免费。 缺点&#xff1a;每次都需要重新登陆输入命令&#xff0c;步骤繁琐无法简化&#xff1b;不能跨端同步。 第…