【iOS】知乎日报第一周总结
知乎日报第一周总结
文章目录
- 知乎日报第一周总结
- 前言
- 网络异步导致视图无法加载
- 加载网络上的图片
- 实现一个上拉刷新的效果
- 左上角的时间
- 初步实现了点击cell进入网页
- 小结
前言
笔者在本周算是正式开始写项目了,本周主要是大致完成了主页的内容,大致完成了主页面的ui以及实现了点击进入单个cell的效果,但还存在一些小问题,之后找到解决方法会补充上去。
网络异步导致视图无法加载
因为网络申请的异步经常会导致我们的视图无法实现正常的加载,会导致我们的视图已经加载好了但是上面没有任何内容。后面笔者查阅了一下资料后知道了应该在我们的block回调函数里面加入dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)
,这个函数的含义是一个异步执行的GCD,他可以保证我们在其他线程的任务完成后回到主线程中执行相关函数,在iOS开发中,布局UI的工作永远都是由主线程去完成的,所以我们必须要在主线程中执行布局ui的相关函数,这里自然也包括[self.iView.tableView reloadData]
下面笔者申请网络请求后重新加载数据的部分代码:
[[Manger sharedManger] urlDataLoad:^(MainPageModel * _Nonnull model) {self.iModel = [NSMutableArray arrayWithObject:model];dispatch_async(dispatch_get_main_queue(), ^{[self.iView.tableView reloadData];[self.iView.headActivity stopAnimating];});}];
加载网络上的图片
这里笔者采用了一个第三方库SDWebImage
这个库来申请我们从网络上获取的图片,具体的使用同样是通过一个cocopods库来进行一个导入就可以实现一个加载网络上的图片。笔者这里就简单介绍一下如何实现一个加载网络图片:
TopContentView* iView = [[TopContentView alloc] initWithFrame:CGRectMake(i * WIDTH, 0, WIDTH, WIDTH - 20)];
[iView.imageView sd_setImageWithURL:[NSURL URLWithString:topModel.image]];
实现一个上拉刷新的效果
实现的效果图:
我们需要实现一个一个上拉刷新的一个效果,同时也需要一个加载的显示,笔者这里没有采用第三方库来实现,而是采用了UIScrollView的协议函数以及UIActivityIndicatorView这两个东西来实现,笔者这里采用的协议函数是- (void)scrollViewDidScroll:(UIScrollView *)scrollView
这个函数来实时监控他的一个滑动,在他划到最底端的时候开始进行一个网络请求申请一个新的数据:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {if (scrollView.tag == 100) {CGFloat x = scrollView.contentOffset.x;//CGFloat y = scrollView.contentOffset.y;CGFloat contentWidth = scrollView.contentSize.width;if (x >= contentWidth - WIDTH) {[scrollView setContentOffset:CGPointMake(WIDTH, 0) animated:NO];NSLog(@"1");} else if (x <= 0) {[scrollView setContentOffset:CGPointMake(contentWidth - 2 * WIDTH, 0) animated:NO];NSLog(@"2");} else {self.iView.page.currentPage = x / WIDTH - 1;}} else if (scrollView.tag == 101 && !self.loading) {CGFloat y = scrollView.contentOffset.y;CGFloat contentHeight = scrollView.contentSize.height;CGFloat height = scrollView.bounds.size.height;NSLog(@"%lf ? %lf", height, contentHeight);NSLog(@"%lf", y);if (y + height >= contentHeight + 10) { // 滑到接近底部的位置NSLog(@"%lf", y);[self loadData];} else if (y < -100) {[self download];}}
}
-(void)loadData {if (self.loading) {return;}self.loading = YES;NSInteger num = [self.dateModel.headString intValue];NSString* str = [NSString stringWithFormat:@"%ld", num - self.iModel.count + 1];NSLog(@"%@", str);self.iView.tableView.tableFooterView = self.iView.footerView;[self.iView.activity startAnimating];//[self.iView.activity startAnimating];[[Manger sharedManger] newDateLoad:^(MainPageModel * _Nonnull model) {[self.iModel addObject:model];NSLog(@"%ld", self.iModel.count);dispatch_async(dispatch_get_main_queue(), ^{[self.iView.tableView reloadData];[self.iView.activity stopAnimating];self.iView.tableView.tableFooterView = nil;self.loading = NO;});} andNsstring:str];
}
这里给这个视图控制器设置了一个bool型的变量,如果这个变量的为YES的时候就说明他正在加载,就会直接退出防止他进入网络申请,从而导致多次申请网络请求,从而导致了加载的问题。
还有下面的加载图案是笔者使用了一个UIActivityIndicatorView的控件,把这个空间添加到一个UIVIew上面,然后把那个UIView加到uitableView的footerView上就可以实现一个加载的效果。然后在网络申请结束之后给这个tableView的footerView重新变成nil就可以实现了,这里笔者给出一张UITabeleView中一些属性和控件的位置关系和图片:
从这张图片上我们就可以看出一条公式也就是contentOffset.y == content的顶部 和 frame.origin.y 的差值,所以只要两者接近的时候就一意味着我们其实已经滑动的快接近底部了,所以就可以进行一个网络请求,但这里其实还有一个frame
和bounds
的区别,这里笔者之后会撰写一篇博客来特别讲述这部分内容。
左上角的时间
左上角的时间笔者是采用了一个NSDate类来实现,通过NSDate来获取当前的时间从而加载到坐上角的视图中。
- (void)judgeDate {NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"MM-dd"];NSString* str0 = [dateFormatter stringFromDate:self.nowDate];NSString* str = [str0 substringWithRange: NSMakeRange(0, 2)];NSDictionary* monthDicty = @{@"01":@"正月",@"02":@"杏月",@"03":@"桃月",@"04":@"槐月",@"05":@"榴月",@"06":@"荷月",@"07":@"霜月",@"08":@"桂月",@"09":@"玄月",@"10":@"阳月",@"11":@"冬月",@"12":@"腊月"};
// NSDictionary* dataDicty = @{@"1":@"一",@"2":@"二",@"3":@"三",@"4":@"四",@"5":@"五",@"6":@"六",@"7":@"七",@"8":@"八",@"9":@"九"};NSString* str2 = [str0 substringWithRange: NSMakeRange(3, 1)];NSString* str3 = [str0 substringWithRange:NSMakeRange(4, 1)];self.monthString = [monthDicty[str] copy];self.dateString = [NSString stringWithFormat:@"%@%@", str2, str3];self.date = [NSString stringWithFormat:@"%@%@", str2, str3];self.month = [str copy];self.headString = [NSString stringWithFormat:@"2024%@%@%@", str, str2, str3];
}
- (NSMutableArray*)yesterDay:(NSInteger) section {NSInteger dateNum = [self.date intValue];NSInteger monthNum = [self.month intValue];NSString* dateStr = [NSString stringWithFormat:@"%ld", dateNum - section];NSString* monthStr = [NSString stringWithFormat:@"%ld", monthNum];return [NSMutableArray arrayWithArray:@[dateStr, monthStr]];
}
初步实现了点击cell进入网页
这里只是初步实现,采用了一个WKweb这个类来实现,具体内容会在下篇博客中讲。
小结
笔者这里还有挺多问题未解决,如无限轮播图下面的一个毛玻璃效果还未实现,以及右上角的导航栏的头像还没布局,笔者准备最后写收藏中心的时候一并加上,这周学到很多知识,也复习了很多内容,发现自己对于各类知识的掌握仍有一些问题,iOS的学习任重而道远,笔者会继续努力学习相关内容。
相关文章:
【iOS】知乎日报第一周总结
知乎日报第一周总结 文章目录 知乎日报第一周总结前言网络异步导致视图无法加载加载网络上的图片实现一个上拉刷新的效果左上角的时间初步实现了点击cell进入网页小结 前言 笔者在本周算是正式开始写项目了,本周主要是大致完成了主页的内容,大致完成了主…...
Springboot整合spring-boot-starter-data-elasticsearch
前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖,旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch,提供了一套完整…...
【大模型系列】mPLUG-Owl3(2024.08)
Paper: https://arxiv.org/pdf/2408.04840Github: https://github.com/X-PLUG/mPLUG-OwlHuggingFace:https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728Author: Jiabo Ye et al. 阿里巴巴 文章目录 0 总结(省流版)1 模型结构1.1 Cross-attention Based Achitectur…...
从0到1学习node.js(express模块)
文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习,根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…...
MambaVision
核心速览 研究背景 研究问题 :这篇文章提出了一种新的混合Mamba-Transformer骨干网络,称为MambaVision,专为视 觉应用量身定制。研究的核心问题是如何有效地结合Mamba的状态空间模型(SSM)和Transf ormer的自注意力机制…...
MySQLDBA修炼之道-开发篇(二)
四、开发进阶 1. 范式和反范式 范式是数据库规范化的一个手段,是数据库设计中的一系列原理和技术,用于减少数据库中的数据冗余,并增进数据的一致性。 范式 1.1 第一范式 第一范式是指数据库表的每一列(属性)都是不可…...
前端必备的环境搭建
一、nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置) 参考地址:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)-CSDN博客 说明: 1)关于nodejs目录不显示&a…...
SpringCloud笔记
什么是降级熔断?为什么要进行熔断? 熔断降级是一种分布式系统的保护机制,用于应对服务不稳定或不可用的情况。 熔断是指当某个服务的调用失败次数或异常比例达到一定阈值时,自动切断对该服务的调用,让请求快速失败&…...
优秀的程序员思考数据结构
原文地址:https://read.engineerscodex.com/p/good-programmers-worry-about-data 我最近在这篇很棒的 Stack Overflow 文章中看到了 Linus Torvalds(Linux 和 Git 的创建者)的一句话。(这篇文章回顾了那篇文章中的许多引述。 它…...
「C/C++」C/C++标准库之#include<cstdlib>通用工具库
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...
Oracle视频基础1.1.3练习
1.1.3 需求: 完整格式查看所有用户进程里的oracle后台进程 查看物理网卡,虚拟网卡的ip地址 ps -ef | grep oracle /sbin/ifconfig要以完整格式查看所有用户进程中的 Oracle 后台进程,并查看物理和虚拟网卡的 IP 地址,可以使用以下…...
python项目实战——多协程下载美女图片
协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …...
基于.NET 8.0,C#中Microsoft.Office.Interop.Excel来操作office365的excel
开发环境: Visual Studio 2022 office365 项目模板:WPF应用程序 框架:.NET 8.0 依赖:Microsoft.Office.Interop.Excel 注意: 1.使用Microsoft.Office.Interop.Excel库时,服务器或电脑里面必须安装得…...
使用无线方式连接Android设备进行调试的两种方法
1.使用配对码配对设备方式 手机(或者平板等安卓设备)和电脑需连接在同一WiFi 下;保证 SDK 为最新版本(adb --version ≥ 30.0.0); step1.手机启用开发者选项和无线调试模式(会提示确认ÿ…...
Valgrind的使用
Valgrind 是一个强大的开源工具,用于检测程序中的内存错误、内存泄漏以及线程问题。它广泛应用于 C/C++ 等需要手动管理内存的编程语言中。以下内容将详细介绍 Valgrind 的安装、基本使用方法、常用命令及其输出结果的解析。 1. 什么是 Valgrind? Valgrind 是一个用于内存调…...
微信小程序瀑布流实现,瀑布流长度不均等解决方法
这是一开始实现的瀑布流,将数据分为奇数列和偶数列 <view class"content-left"><block wx:for"{{list}}" wx:key"list"><template isitem-data data{{...item}} wx:if"{{index % 2 0}}"></template&…...
Notepad++通过自定义语言实现日志按照不同级别高亮
借助Notepad的自定义语言可以实现日志的按照不同级别的高亮; 参考: https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下: xml文件: <NotepadPlus><UserLang name"Ansibl…...
2024年四川省大学生程序设计竞赛 补题记录
文章目录 Problem A. 逆序对染色(思维树状数组)Problem B. 连接召唤(贪心)Problem E. L 型覆盖检查器(模拟)Problem F. 小球进洞:平面版(几何)Problem G. 函数查询Proble…...
17_事件的处理
目录 绑定事件与解绑事件优化事件的绑定和解绑方式处理不同事件类型的绑定处理同一事件类型多个事件处理函数事件冒泡与更新时机问题 绑定事件与解绑事件 既然要处理事件,那么首先面临的问题是如何在 vnode 中描述这个事件,在 vnode.props 中࿰…...
1FreeRTOS学习(队列、二值信号量、计数型信号量之间的相同点和不同点)
相同点: (1)传递区间 队列、二值信号量、计数型信号量均可用在任务与任务,任务与中断之间进行消息传递 (2) 传递方式 创建队列--发送队列--接受队列 创建二值信号量--发送二值信号量--接受二值信号量 创建计…...
数据库设计与范式及其应用
数据库设计是数据库管理系统(DBMS)中的核心环节,良好的数据库设计不仅可以提高数据存取的效率,还能增强数据的可维护性和一致性。范式(Normalization)是一种设计原则,用于减少数据冗余和提高数据…...
笔记-配置PyTorch(CUDA 12.2)
文章目录 前言一、安装 PyTorch(CUDA 12.2)1. 创建并激活 Conda 环境2. 安装 PyTorch(CUDA 12.2)3. 安装 torch_geometric 及依赖项4. 验证安装 总结 前言 一、安装 PyTorch(CUDA 12.2) 1. 创建并激活 Con…...
[C++]——红黑树(附源码)
目录 一、前言 二、正文 2.1 红黑树的概念 2.2 红黑树的性质 2.3红黑树节点的定义 2.4 红黑树的插入 2.4.1 情况一 2.4.2 情况二 编辑 2.4.3 情况三 2.5 红黑树的验证 三、全部代码 四、结语 一、前言 在上一篇博客中,为小伙伴们进行了AVL树的讲解&#…...
网络文件系统搭建
在CentOS7上搭建网络文件系统(NFS),并让客户端进行挂载,具体步骤如下: 1. 服务器端操作 安装NFS服务器软件包: 执行以下命令安装NFS服务: sudo yum install nfs-utils -y 启动并启用NFS服务&…...
基于vue、VantUI、django的程序设计
首先构建vue项目,构建项目点这里 安装 npm install axios axios简介 Axios 是一个基于 promise 的 HTTP 库,用于发起请求和接收响应,实现异步操作 基本使用 axios对象 请求响应拦截 在utils文件夹里新建ajax.js 创建一个axios对象并…...
京准电钟解读:NTP网络对时服务器助力厂区改造方案
京准电钟解读:NTP网络对时服务器助力厂区改造方案 京准电钟解读:NTP网络对时服务器助力厂区改造方案 1)系统概述 时钟系统可通过网络进行管理及时间校对,为厂区提供高精度、全天时、全天候 的授时服务,统一全厂各种系统…...
本地docker-compose仓库搭建以及推送docker镜像到仓库
前言 以下部分知识只适用于linux,不适合小白,请自行甄别执行 1.搭建 #参考 https://blog.csdn.net/u011535199/article/details/107457275 version: 3 services:registry:restart: alwaysimage: registry:2ports:- 5000:5000environment:#REGISTRY_HT…...
WPF+MVVM案例实战(八)- 自定义开关控件封装实现
文章目录 1、案例运行效果2、项目准备2、功能实现1、控件模板实现2、控件封装1、目录与文件创建2、各文件功能实现 3、开关界面与主窗体菜单实现1、开关界面实现2、主窗体菜单实现 4、源代码获取 1、案例运行效果 2、项目准备 打开项目 Wpf_Examples,新建ToggleBut…...
单机kafka性能需要高性能的硬件做支撑
一般来说,单机kafka在硬件支持的情况下,能支持每秒100万写入,如果硬件没有那么好的话(机械硬盘,容器内给内存8G, CPU也不是很好),就只能减少每秒的写入量,每秒写入5万都比较不错了。 如果强行每…...
Spark 的 Http Broadcast 和 Torrent Broadcast 广播实现类的对比
在 Apache Spark 中,广播机制用于高效地将小型只读数据分发到集群中的各个执行器(Executor)。Spark 中主要有两种不同的广播实现方式:Http Broadcast 和 Torrent Broadcast。这两种方式的核心目标都是将数据高效地分发给所有工作节…...
成都网站建设成都网络公司/seo策略主要包括
代码 <el-table ref"table"> ... </eltable>...scrollBottom() { /** 如果有数据加载再到顶部就用nexttick */ this.$nextTick(() > {this.$refs.table.bodyWrapper.scrollTop this.$refs.table.bodyWrapper.scrollHeight; }) }...
企业网站优化公司有哪些/发布广告的平台免费
select条件查询的格式如下: SELECT查询列表 FROM 表名 WHERE筛选条件;根据筛选条件可以分为以下几类: 1.按照条件按表达式进行筛选 常用条件运算符如下:> 、<、、!、<>、<、> 2.按照逻辑表达式进行筛选 …...
wordpress注册邮件验证/新闻软文推广案例
异常 原因 是我浏览器使用的广告拦截插件阻止了请求的发送。我这里使用的广告拦截插件是ADGUARD。 解决 关闭该插件,但为了其他网页能拦截广告,应该过滤掉该页面。 能正常发送了 参考链接:接口请求跳坑: Status (blocked:other)…...
什么网站可以看到绵阳建设/重庆seo全面优化
1.概述 nginx有两类进程,一类称为master进程(相当于管理进程),另一类称为worker进程(实际工作进程)。启动方式有两种: (1)单进程启动:此时系统中仅有一个进程,该进程既充当master进程的角色&…...
wordpress改代码/长沙seo男团
出品人简介章淼 百度资深研发工程师,1994年进入清华大学计算机系学习,2004年博士毕业,之后留校任教至2006年。1997年至2006年在清华大学从事互联网协议和网络体系结构的研究。2006年至2012年在搜狗、腾讯等多家公司从事用户产品的研发工作。2…...
企业做门户网站的重要性/企业推广app
/* PID的参数设置可以参照以下来进行: 参数整定找最佳,从小到大顺序查; 先是比例后积分,最后再把微分加; 曲线振荡很频繁,比例度盘要放大; 曲线漂浮绕大湾,比例度盘往小扳; 曲线偏离回复慢,积分时…...