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

「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封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写&#xff0c;主要完成了首页的仿写&#xff0c;进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…...

windows C#-匿名类型

匿名类型提供了一种方便的方法&#xff0c;可用来将一组只读属性封装到单个对象中&#xff0c;而无需首先显式定义一个类型。 类型名由编译器生成&#xff0c;并且不能在源代码级使用。 每个属性的类型由编译器推断。 可结合使用 new 运算符和对象初始值设定项创建匿名类型。 …...

CryptoHack 简介

CryptoHack 简介 文章目录 CryptoHack 简介一、python的安装&#xff0c;运行二、ASCII码三、十六进制四、Base64五、字节和大整数六、XOR1.基本2.xor属性3.xor隐藏字节4.cryptohack——You either know, XOR you dont 一、python的安装&#xff0c;运行 二、ASCII码 chr()函数…...

transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.

把scene.add(transformControls);改为scene.add(transformControls.getHelper());...

游戏开发与游戏运营:哪个更难?

在探讨游戏产业时&#xff0c;游戏开发和游戏运营是两个至关重要的环节。它们各自承担着不同的职责&#xff0c;共同推动着游戏产品的成功与发展。然而&#xff0c;关于哪个环节更难的问题&#xff0c;并没有一个绝对的答案&#xff0c;因为两者都涉及复杂的流程、专业技能和独…...

大模型在自动化渗透测试中的应用

1. 引言 随着人工智能技术的快速发展&#xff0c;特别是大模型&#xff08;如GPT-3、GPT-4等&#xff09;的出现&#xff0c;自动化渗透测试领域迎来了新的机遇。大模型具有强大的自然语言处理能力和生成能力&#xff0c;能够在多个环节提升渗透测试的效率和准确性。本文将详细…...

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…...

C语言 | Leetcode C语言题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; 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如何实现数据的双向绑定和局部更新&#xff1f; Vue.js中数据的双向绑定和局部更新可以通过v-model指令来实现。v-model是一个内置的双向数据绑定机制&#xff0c;用于将输入元素&#xff08;如input、textarea、select等&#xff09;与Vue实例的数据进行双向绑定。 在…...

java学习1

一、运算符 1.算术运算符 在代码中&#xff0c;如果有小数参与计算&#xff0c;结果有可能不精确 1-1.隐式转换和强制转换 数字进行运算时&#xff0c;数据类型不一样不能运算&#xff0c;需要转成一样的&#xff0c;才能运算 &#xff08;1&#xff09;隐式转换&#xff1a…...

如何缩小PPT演示文稿的大小?

有时候PPT的磁盘空间一不小心就变得意想不到的大&#xff0c;比如上百MB&#xff0c;该如何缩小PPT的大小从而便于上传或者携带呢&#xff1f; 导致PPT大的原因&#xff1a; 媒体文件在插入或者复制到演示文稿里会被直接涵盖在其中&#xff08;.pptx版本&#xff09;&#xf…...

闯关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里面的类列表&#xff0c;类的数量都是固定的。 对上一节中的dex反编译 使用DexClassLoader类动态加载插件dex   利用jadx对dex进行反编译可以看到有哪些类 源码分析 BaseDexClassLoader 从BaseDexClassLoader类加载器开始分析 在BaseDexClassLoade…...

RSA算法:数字安全的基石

## RSA算法&#xff1a;数字安全的基石 RSA算法是现代密码学的重要组成部分&#xff0c;它为安全通信和数据保护提供了坚实的基础。本文将探讨RSA算法的基本原理、实施过程以及实际应用场景。 ### 一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;算法是由…...

DPDK高性能处理框架VPP

VPP 环境安装 $ git clone -b stable/1801 https://github.com/FDio/vpp.git $ ./extras/vagrant/build.sh && make 在编译成功以后&#xff0c;会生成上图红色的 deb 表 $ dpkg –i vpp-lib_18.01.2-1~g9b554f3_amd64.deb $ dpkg –i vpp_18.01.2-1~g9b554f3_amd…...

Spring工厂方式实现实例化bean有哪些方式?

在Spring框架中&#xff0c;实例化Bean的方式有多种&#xff0c;其中通过工厂方法&#xff08;Factory Method&#xff09;来创建Bean是一种常见的方式。这种方式允许你通过自定义的工厂类或静态方法来生成Bean实例&#xff0c;从而提供了更灵活和复杂的实例化逻辑。 以下是Sp…...

衡石分析平台系统分析人员手册-指标分析看板

指标分析看板为业务指标量身打造的分析看板。拖拽指标就可形成看板&#xff0c;通过点选对指标分析图表进行配置&#xff0c;整个过程简单易上手。分析人员根据业务分析场景制作图表&#xff0c;无需对指标的数据进行再次加工处理。 指标分析是为业务指标定制的看板&#xff0…...

《C++17 结构化绑定:解锁不同类型处理的秘籍》

在 C17 中&#xff0c;结构化绑定是一个强大且引人注目的特性。它为开发者处理复杂的数据结构和多种类型的返回值提供了一种简洁而高效的方式。然而&#xff0c;正确处理不同类型的绑定和初始化问题是充分发挥这一特性优势的关键。 理解结构化绑定的本质 结构化绑定允许我们使…...

大型音频模型:AudioLLMs

大型音频模型&#xff08;Large Audio Models&#xff0c;简称AudioLLMs&#xff09;是近年来人工智能领域的一个重要研究方向&#xff0c;它们基于深度学习和大模型架构&#xff0c;能够处理和理解复杂的音频数据。以下是对大型音频模型的研究综述&#xff1a; 1. 引言 随着…...

【ShuQiHere】️理解Python中的相对路径:使用 `..` 和 `.` 的指南

【ShuQiHere】️&#x1f31f; 目录 引言什么是相对路径&#xff1f;路径中使用 . 和 ..相对路径的示例使用子文件夹中的数据使用相对路径的最佳实践结论进一步探索 引言 &#x1f30d; 在Python编程中&#xff0c;处理文件时了解如何使用相对路径至关重要。相对路径使我们…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...