仿写知乎日报第一周
效果图
主要的逻辑
Manager封装网络请求
- 首先,对于获取网络请求,我是将这些方法封装成了一个类Manager,后续在获取以往的内容时又封装了一个beforeManager类用于网络请求。这里不多赘述,Manager封装网络请求的知识参考我的以往博客:iOS——Manager封装网络请求
- 获取到网络请求之后,使用Model层的类和JSONModel来获取接收到的内容,JSONModel的知识可以参考我以往的博客:iOS——JSONModel的使用与JSONModel的嵌套,在Model层我使用了两个类,一个mainModel用于接收一开始启动程序接收的内容,一个beforeModel用于接收以往的内容。
线程的管理
在写知乎日报的时候,遇见了线程的问题,比如说在viewController中获取Manager网络请求的内容时,因为在viewControllert中viewDidLoad执行的很早,所以如果将View层的初始化放在viewDidLoad的话,就会先去布局好UI,等网络请求好时无法将请求到的数据赋给UI控件。所以这时候需要将View层的初始化重新放在一个实例方法loadUI中,在完成网络请求之后再去调用该loadUI方法。这时候就会发现,如果我们只是将其不加修饰写在网络请求完回调的方法时,就会报错,因为View的初始化不在主线程进行。这时我们就需要使用:
dispatch_async(dispatch_get_main_queue(), ^{[self loadUI];});
使其在主线程中进行,才能解决问题。
同样的,在后面刷新tableView时的reloadData也要使用这个方法,是因为在iOS中,reloadData方法必须在主线程上调用。
加载网络图片
在进行网络请求时,我发现请求到的图片内容都是url,此时我们没办法直接将其转化为图片形式,所以就要使用一个第三方库:SDWebImage库,这个库可以将我们请求到的url转为图片,其用法如下:
首先,我们要导入该库:和Masonry、JSONModel这些的方法一样:pod ‘SDWebImage’ 即可
然后获取我们通过网络请求到的图片的url,并且导入SDWebImage的头文件。然后使用 SDWebImage 中的 sd_setImageWithURL: 方法将网络图片加载到 UIImageView 中。
示例:
[yourImageView sd_setImageWithURL:[NSURL URLWithString:@"图片的url"]placeholderImage:[UIImage imageNamed:@"placeholder"]];
这将下载位于指定 URL 的图片并将其设置为 yourImageView,如果图片下载失败,将会使用 placeholder 图片作为占位符。
左上角时间的获取
这里我使用了NSDate来获取当前时间,并将时间转化为字符串,然后赋值给View层。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN@interface timeModel : NSObject
- (NSArray*)titleTimeLabel;
@endNS_ASSUME_NONNULL_END
#import "timeModel.h"@implementation timeModel- (NSArray *)titleTimeLabel {NSDate *timeDate = [NSDate date];NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday;NSDateComponents *comp = [gregorian components: unitFlags fromDate: timeDate];NSString *month = [[NSString alloc] init];if (comp.month == 1) {month = @"一";}if (comp.month == 2) {month = @"二";}if (comp.month == 3) {month = @"三";}if (comp.month == 4) {month = @"四";}if (comp.month == 5) {month = @"五";}if (comp.month == 6) {month = @"六";}if (comp.month == 7) {month = @"七";}if (comp.month == 8) {month = @"八";}if (comp.month == 9) {month = @"九";}if (comp.month == 10) {month = @"十";}if (comp.month == 11) {month = @"十一";}if (comp.month == 12) {month = @"十二";}NSString *day = [NSString stringWithFormat:@"%ld", (long)comp.day];NSArray * timeArr = [NSArray arrayWithObjects:month, day, nil];return timeArr;
}@end
单元格的刷新
这块我的代码还有问题,但是我初步写出了这个逻辑。我使用了- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;协议方法,当即将出现某indexPath.row位置的单元格时,就调用该方法。我使用了一个全局变量numberOfCell,其初始值为1,我的单元格的行数的返回值就是5 * numberOfCell,每当调用到该方法时,numberOfCell就会加一,因此我的单元格数量刷新后就会增加5个。当触发该方法的时候,就获取存在ManagerModel类中date属性(该属性表示当天的日期的字符串),然后将该date-1就得到前一天的时间,我还定义了一个全局变量n用于表示刷新了多少天,每当刷新一次就让n+1,因此使用date-n就能得到刷新的对应天数的字符串,再将该字符串传给beforeManager的timeStr属性,该属性用来补全https://news-at.zhihu.com/api/4/news/before/%@的url,然后进行网络请求,这样我们就获得到了刷新后的内容,再将该内容赋给对应的beforeStoriesModel类的实例的stories属性,再将该属性给单元格并刷新单元格,就实现了单元格的刷新。
但是目前有个获取到的stories数组的越界问题,因此我只能刷新两次就崩了,这周我改正了这个问题会将解决方法写在下周的博客中。
相关文章:

仿写知乎日报第一周
效果图 主要的逻辑 Manager封装网络请求 首先,对于获取网络请求,我是将这些方法封装成了一个类Manager,后续在获取以往的内容时又封装了一个beforeManager类用于网络请求。这里不多赘述,Manager封装网络请求的知识参考我的以往博…...

32二叉树——DFS深度优先遍历
目录 深度优先算法(Depth-First Search,DFS) LeetCode之路——102. 二叉树的层序遍历 分析 深度优先算法(Depth-First Search,DFS) DFS是一种用于遍历或搜索树状数据结构的算法,其中它首先探…...

华为昇腾NPU卡 ChatGLM2模型使用
参考:https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/glm2.md#chatglm2-6b 1、安装环境: 昇腾NPU卡对应英伟达GPU卡,CANN对应CUDA底层; mindspore对应pytorch;mindformers对应transformers 本…...

【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测
1. 概述 1.1 什么是集成模型/集成学习 "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起,以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果,集成学习可以减少单个模型的偏差和方差&am…...

如何提高广告投放转化率?Share Creators 资产库与Appsflyer营销数据的全面结合
如何提高广告投放转化率?Share Creators 资产库与Appsflyer营销数据的全面结合 全球经济进入了低迷期。 营销成本越来越高, 营销需要更务实,注重投入产出比。众所周知,除了渠道、客群画像以外, 优秀的广告设计图&#…...

《软件方法》2023版第1章(11)1.4.3 具体工作步骤
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.4 应用UML的建模工作流 1.4.3 使用UML建模的工作流步骤 图1-17中“工件形式”一列所列出的图就是本书推荐的在建模工作流ABCD中的UML用法,我用活动图进一步表示建模的步…...
git将当前分支A强制推送远程分支pro上
前言 开发中基于线上分支pro创建了A分支,开发完成之后。又基于线上分支pro创建了B分支,都以此合并到测试分支,两个分支更改中都动用部分共同的文件,这就导致后续开发合并代码越来越乱,这时你想把本地开发的分支强推到…...
【计算机基础】存储器
目录 一.概念二.分类1.按存储介质分类2.按存储方式分类3.按存储器的读写功能分类4.按信息的可保存性分类5.按在计算机系统中的作用分类 三.主存区分SRAM、DRAM、Flash、DDR1.SRAM(静态随机存储器࿰…...

【LCR 159. 库存管理 III】
目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int getrandom(int left,int right,vector<int>& stock){return stock[rand()%(right-left1)left];}void qsort(int l,int r,vector<int>& s…...
Android ADB 常见问题和注意事项
Android ADB 常见问题和注意事项 在使用 ADB 过程中,可能会遇到一些常见问题和需要注意的事项: 1. USB 调试 要使用 ADB,你需要在设备上启用 USB 调试模式。这通常在设备的开发者选项中设置。如果你不能看到开发者选项,可以在设…...

TCP/IP五元组
什么是五元组规则? 五元组是通信术语,英文名称为five-tuple,或5-tuple,五元组包括源IP地址(source IP)、源端口(source port)、目的IP地址(destination IP)、目的端口(destination port) 和 传输层协议(the layer 4 protocol)的五个量集合。…...
aiohttp ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] 错误处理
这个问题原因吧其实就是3.10 开始官网更新了TLS 堆栈默认安全设置 感兴趣的可以看下链接 python官网叙述: Python 3.10 增加了 TLS 堆栈的默认安全设置 解决也很简单,将ssl安全等级降下来就行,例如: import ssl import aiohttp ctx ssl.cr…...

分析RPA流程自动化的挑战和解决方案
随着数字化工具和自动化解决方案的日益成熟,各行各业发掘到RPA机器人流程自动化技术的先进性,逐渐规模化部署RPA。 为了更好地推进RPA的实施,金智维在这里分享一些运用这项技术时面临的共同挑战,并给出针对性的解决方案。 组织架构…...

我试图扯掉这条 SQL 的底裤。只能扯一点点,不能扯多了
之前不是写分页嘛,分页肯定就要说到 limit 关键字嘛。 然后我啪的一下扔了一个链接出来: https://dev.mysql.com/doc/refman/8.0/en/limit-optimization.html 这个链接就是 MySQL 官方文档,这一章节叫做“对 Limit 查询的优化”,针对 limit 和 order by 组合的场景进行了较…...
LeNet(pytorch实现
LeNet 本文编写了一个简单易懂的LeNet网络,并在F-MNIST数据集上进行测试,允许使用GPU计算 在这里插入代码片 import torch from torch import nn, optim import d2lzh_pytorch as d2ldevice torch.device(cuda if torch.cuda.is_available() else cp…...

Selenium获取百度百科旅游景点的InfoBox消息盒
前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了SeleniumPhantomjs后,准备利用它们获取百度百科的旅游景点消息盒(InfoBox),这也是毕业设计实体对齐和属…...

springcloud笔记 (8) -网关 Gateway
网关 出国需要过海关 网关:网络的关卡 网关的作用 1:路由转发 2:安全控制 保护每个服务,不需要将每个暴露出去 3:负载均衡 1.没有网关:客户端直接访问我们的微服务,会需要在客户端配置很多…...

【C++编程语言】STL常用算法 算术生成和集合算法
1.算术生成算法概念 算法简介: accumlate 计算容器元素累计总和fill 向容器中添加元素 注意:算术生成算法属于小型算法 使用时包含头文件为#include<numeric> 2.accumulate /*函数原型:int accumulate(iterator beg ,iterator end…...
解放双手:VMLogin自动化工具的高效便捷
在现代工作环境中,时间和效率是我们追求的关键。幸运的是,随着技术的发展,自动化工具为我们提供了解放双手的机会。其中,防关联浏览器的自动化就是一种强大的工具,能够简化我们的工作流程并提升效率。本文将探讨浏览器…...
深度解析网络代理技术及其在网络安全和爬虫应用中的关键作用
在当今数字化时代,网络代理技术在维护网络安全、保护隐私以及实现高效数据获取方面发挥着不可或缺的作用。本文将全面解析Socks5代理、IP代理等关键技术,并探讨其在网络安全和爬虫开发中的重要作用。 1. Socks5代理与SK5代理:多功能代理协议…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...