「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]];
}
总结
首页的大部分已经完成,正在写单元格点击的响应事件。进度较慢,下星期尽量多写些。
相关文章:
「iOS」——知乎日报一二周总结
知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写,主要完成了首页的仿写,进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…...
windows C#-匿名类型
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用 new 运算符和对象初始值设定项创建匿名类型。 …...
CryptoHack 简介
CryptoHack 简介 文章目录 CryptoHack 简介一、python的安装,运行二、ASCII码三、十六进制四、Base64五、字节和大整数六、XOR1.基本2.xor属性3.xor隐藏字节4.cryptohack——You either know, XOR you dont 一、python的安装,运行 二、ASCII码 chr()函数…...
transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.
把scene.add(transformControls);改为scene.add(transformControls.getHelper());...
游戏开发与游戏运营:哪个更难?
在探讨游戏产业时,游戏开发和游戏运营是两个至关重要的环节。它们各自承担着不同的职责,共同推动着游戏产品的成功与发展。然而,关于哪个环节更难的问题,并没有一个绝对的答案,因为两者都涉及复杂的流程、专业技能和独…...
大模型在自动化渗透测试中的应用
1. 引言 随着人工智能技术的快速发展,特别是大模型(如GPT-3、GPT-4等)的出现,自动化渗透测试领域迎来了新的机遇。大模型具有强大的自然语言处理能力和生成能力,能够在多个环节提升渗透测试的效率和准确性。本文将详细…...
《AI在企业战略中的关键地位:以微软和阿里为例》
内容概要 在当今商业环境中,人工智能(AI)的影响力如滔滔洪水,愈演愈烈。文章将揭示AI在企业战略中的崛起,尤其以微软和阿里巴巴为代表的企业,这两家科技巨头通过不同方式,将智能技术融入其核心…...
C语言 | Leetcode C语言题解之第537题复数乘法
题目: 题解: bool parseComplexNumber(const char * num, int * real, int * image) {char *token strtok(num, "");*real atoi(token);token strtok(NULL, "i");*image atoi(token);return true; };char * complexNumberMulti…...
Vue如何实现数据的双向绑定和局部更新?
1、Vue如何实现数据的双向绑定和局部更新? Vue.js中数据的双向绑定和局部更新可以通过v-model指令来实现。v-model是一个内置的双向数据绑定机制,用于将输入元素(如input、textarea、select等)与Vue实例的数据进行双向绑定。 在…...
java学习1
一、运算符 1.算术运算符 在代码中,如果有小数参与计算,结果有可能不精确 1-1.隐式转换和强制转换 数字进行运算时,数据类型不一样不能运算,需要转成一样的,才能运算 (1)隐式转换:…...
如何缩小PPT演示文稿的大小?
有时候PPT的磁盘空间一不小心就变得意想不到的大,比如上百MB,该如何缩小PPT的大小从而便于上传或者携带呢? 导致PPT大的原因: 媒体文件在插入或者复制到演示文稿里会被直接涵盖在其中(.pptx版本)…...
闯关leetcode——234. Palindrome Linked List
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/palindrome-linked-list/description/ 内容 Given the head of a singly linked list, return true if it is a palindrome or false otherwise. Example 1: Input: head [1,2,2,1] Output: tru…...
通过源码分析类加载器里面可以加载的类
类列表 每一个ClassLoader里面的类列表,类的数量都是固定的。 对上一节中的dex反编译 使用DexClassLoader类动态加载插件dex 利用jadx对dex进行反编译可以看到有哪些类 源码分析 BaseDexClassLoader 从BaseDexClassLoader类加载器开始分析 在BaseDexClassLoade…...
RSA算法:数字安全的基石
## RSA算法:数字安全的基石 RSA算法是现代密码学的重要组成部分,它为安全通信和数据保护提供了坚实的基础。本文将探讨RSA算法的基本原理、实施过程以及实际应用场景。 ### 一、RSA算法概述 RSA(Rivest-Shamir-Adleman)算法是由…...
DPDK高性能处理框架VPP
VPP 环境安装 $ git clone -b stable/1801 https://github.com/FDio/vpp.git $ ./extras/vagrant/build.sh && make 在编译成功以后,会生成上图红色的 deb 表 $ dpkg –i vpp-lib_18.01.2-1~g9b554f3_amd64.deb $ dpkg –i vpp_18.01.2-1~g9b554f3_amd…...
Spring工厂方式实现实例化bean有哪些方式?
在Spring框架中,实例化Bean的方式有多种,其中通过工厂方法(Factory Method)来创建Bean是一种常见的方式。这种方式允许你通过自定义的工厂类或静态方法来生成Bean实例,从而提供了更灵活和复杂的实例化逻辑。 以下是Sp…...
衡石分析平台系统分析人员手册-指标分析看板
指标分析看板为业务指标量身打造的分析看板。拖拽指标就可形成看板,通过点选对指标分析图表进行配置,整个过程简单易上手。分析人员根据业务分析场景制作图表,无需对指标的数据进行再次加工处理。 指标分析是为业务指标定制的看板࿰…...
《C++17 结构化绑定:解锁不同类型处理的秘籍》
在 C17 中,结构化绑定是一个强大且引人注目的特性。它为开发者处理复杂的数据结构和多种类型的返回值提供了一种简洁而高效的方式。然而,正确处理不同类型的绑定和初始化问题是充分发挥这一特性优势的关键。 理解结构化绑定的本质 结构化绑定允许我们使…...
大型音频模型:AudioLLMs
大型音频模型(Large Audio Models,简称AudioLLMs)是近年来人工智能领域的一个重要研究方向,它们基于深度学习和大模型架构,能够处理和理解复杂的音频数据。以下是对大型音频模型的研究综述: 1. 引言 随着…...
【ShuQiHere】️理解Python中的相对路径:使用 `..` 和 `.` 的指南
【ShuQiHere】️🌟 目录 引言什么是相对路径?路径中使用 . 和 ..相对路径的示例使用子文件夹中的数据使用相对路径的最佳实践结论进一步探索 引言 🌍 在Python编程中,处理文件时了解如何使用相对路径至关重要。相对路径使我们…...
Web开发环境快速搭建:Miniconda-Python3.11镜像实战应用
Web开发环境快速搭建:Miniconda-Python3.11镜像实战应用 1. 为什么选择Miniconda-Python3.11 Python作为Web开发的主流语言之一,环境配置一直是新手面临的第一个挑战。Miniconda-Python3.11镜像提供了一种开箱即用的解决方案,相比传统安装方…...
降AIGC哪家强?2026零成本保姆级教程:DeepSeek/Kimi/豆包专属降重指令实测与差异解析
很多时候大学生写论文逻辑太严谨、话术太规范,反而会导致AI率过高,且一旦AI率过高,轻则退回重改,重则取消答辩资格,这后果谁都担不起。 为了帮大家有效降低aigc率,这周我专门针对目前市面上最主流的三款大…...
别再只盯着GPU了!聊聊华为昇腾310/910芯片在AI推理和训练中的实战选型心得
华为昇腾芯片实战选型指南:如何用310/910构建高性价比AI计算方案 当你在深夜调试一个即将上线的图像识别模型时,服务器机房的轰鸣声和不断攀升的电费账单可能比代码bug更让人焦虑。三年前,我们团队就面临这样的困境——用8块NVIDIA V100训练的…...
医学影像与卫星图的救星?深入聊聊JPEG-LS算法在边缘计算设备上的应用优势
JPEG-LS算法:边缘计算时代的医学影像与卫星图像压缩利器 当一台CT扫描仪每秒产生数百张16位深度的医学影像,或一颗遥感卫星每天传回数TB的高清地表数据时,传统的图像压缩方案往往面临两难选择——要么牺牲宝贵的诊断细节,要么耗尽…...
让ai成为你的vue开发搭档,用快马智能优化代码性能与结构
让AI成为你的Vue开发搭档,用快马智能优化代码性能与结构 最近在开发一个Vue3项目时,遇到了几个性能瓶颈问题。作为一个前端开发者,性能优化是绕不开的话题。幸运的是,借助AI辅助开发工具,这些问题都能得到更高效的解决…...
大模型进阶:掌握Function Calling和MCP,解锁AI生产力(收藏版)
本文深入探讨了Function Calling技术如何帮助大模型获取实时信息、执行任务,以及MCP协议在大模型与外部交互中的关键作用。文章阐述了从提示工程到RAG,再到Function Calling和MCP的技术演进路径,强调了这些技术如何使大模型从信息工具转变为生…...
Monocle 3实战:5步搞定单细胞marker基因筛选与可视化(R语言版)
Monocle 3实战:5步搞定单细胞marker基因筛选与可视化(R语言版) 单细胞RNA测序技术正在重塑我们对复杂生物系统的理解。在这个数据爆炸的时代,如何从海量的单细胞数据中快速准确地识别关键marker基因,成为每个研究者必须…...
python-flask-djangol框架的青少年编程学习平台
目录技术选型与架构设计功能模块划分开发阶段规划安全与扩展性示例代码片段(Flask路由)部署与运维教育适配项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 采用Python生态的Flask或D…...
AI小白进阶必看!吴恩达教你用“职业技能包“让AI像专业员工一样工作(收藏版)
本文系统拆解了吴恩达联合Anthropic推出的Agent Skills视频课程,深入浅出地讲解了如何通过构建"职业技能包"(Skills),让通用AI Agent在具体业务场景中像专业员工一样可靠工作。文章从Agent Skills的定义、必要性、能力维…...
告别低效收藏:MarkDownload让网页内容保存效率提升300%
告别低效收藏:MarkDownload让网页内容保存效率提升300% 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload …...
