【iOS】知乎日报第四周总结

【iOS】知乎日报第四周总结

文章目录

  • 【iOS】知乎日报第四周总结
    • 前言
    • 首页获取三个数据混乱的问题
    • FMDB库的一个使用
      • 创建一个库
      • 添加数据
      • 删除数据
      • 修改数据
    • 缓存高度数组
    • 小结

前言

这周笔者主要完成了收藏中心的一个内容和一个对于FMDB这个第三方库的一个学习,以及修改了首页获取三个数据顺序混乱的一个问题,以及优化UITableView的内容。

首页获取三个数据混乱的问题

这里首页获取三个数据混乱的原因主要还是因为网络请求的异步回调的问题,这里笔者上网搜索了一下相关内容后面采用了一个NSConditionLock这个类和一个并行队列来解决,这个类是状态锁,这里笔者还不是很清楚原因,这里可以简单介绍一下状态锁的一个内容:

NSConditionLock 用于控制并发任务的执行顺序

  • NSConditionLock 是一种线程同步机制,它允许线程根据特定条件加锁和解锁。在这段代码中,lock 的初始条件为 0。
  • 每个任务都会调用 lockWhenCondition:i,只有当 lock 的当前条件与 i 相等时,任务才会继续执行,否则会阻塞等待。

该部分内容来自chatgpt

这里笔者给出我下滑加载的部分代码:

-(void)loadData {if (self.loading) {return;}self.loading = YES;NSInteger num = [self.dateModel.headString intValue];NSString* str = [self.dateModel computingTime:self.dateModel.headString andDay:self.iModel.count - 1];NSInteger count = self.iModel.count;NSLog(@"%@", str);self.iView.tableView.tableFooterView = self.iView.footerView;[self.iView.activity startAnimating];//dispatch_group_t gruop = dispatch_group_create();//[self.iView.activity startAnimating];NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:0];dispatch_queue_t queue = dispatch_queue_create(@"current", DISPATCH_QUEUE_CONCURRENT);//创建一个并行队列for (int i = 0; i < 3; i++) {//str = [self.dateModel computingTime:self.dateModel.headString andDay:self.iModel.count - 1];//dispatch_group_enter(gruop);NSLog(@"执行第%ld个任务", i);str = [self.dateModel computingTime:self.dateModel.headString andDay:count - 1 + i];NSLog(@"每个任务对应的字符串%@", str);[[Manger sharedManger] newDateLoad:^(MainPageModel * _Nonnull model) {dispatch_async(queue, ^{[lock lockWhenCondition:i];[self.iModel addObject:model];NSLog(@"%ld", self.iModel.count);[lock unlockWithCondition:i + 1];if (i == 2) {dispatch_async(dispatch_get_main_queue(), ^{[self.iView.tableView reloadData];[self.iView.activity stopAnimating];self.iView.tableView.tableFooterView = nil;self.loading = NO;});}NSLog(@"%@", str);});//dispatch_group_leave(gruop);} andNsstring:str];//dispatch_group_wait(gruop, DISPATCH_TIME_FOREVER);}    
}

FMDB库的一个使用

这里笔者实现收藏中心采用了一个第三方库FMDB这个库来实现的,首先这个库的是用OC来包装sqlite这个小型数据库,然后我们只需要调用她分装好的一个接口就可以了,这里笔者简单介绍一下使用方法,不涉及原理。

创建一个库

创建一个库主要有三种方式来创建,这里笔者介绍的是绝对路径来创建一个数据库。

    1. 绝对路径
    1. 空字符串 @""

会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除。

    1. nil

会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁

在我们对于收藏中心的要求是要存储起来,所以我们采用第一种绝对路径来创建一个数据库

- (void)creatDateBase {NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;self.sqlFilePath = [path stringByAppendingPathComponent:@"collectionCenter.sqlite"];self.db = [FMDatabase databaseWithPath:_sqlFilePath];//[self delete];if ([self.db open]) {NSLog(@"load success");} else {NSLog(@"error");}
}

添加数据

对于数据库而言我们永远只用在库的最后添加一个数据就可以了,这里采用的是一个INSERT语句

下面给出相关的一个代码:

-(void)insertData {NSString* sqlInsert = @"INSERT INTO  collectionCenter (webPageId, webPageTitle, webImageURL, likes, star) VALUES (?, ?, ?, ?, ?)";if ([[DataBaseManger ShareDateBaseManger].db open]) {BOOL flag = [[DataBaseManger ShareDateBaseManger].db executeUpdate:sqlInsert, self.webPageId, self.titile, self.imageUrl, @(self.selectLike), @(self.selectStar)];if (flag) {NSLog(@"success");} else {NSLog(@"error");}}}

删除数据

删除数据的语句是DELETE,我们只要知道有一个属性与我们查找的相同就可以进行一个删除的操作。

-(void)deleteData {NSString* sqlDelete = @"delete from collectionCenter where (webPageId) = (?) and (webPageTitle) = (?) and (webImageURL) = (?) and (likes) = (?) and (star) = (?)";if ([[DataBaseManger ShareDateBaseManger].db open]) {BOOL flag = [[DataBaseManger ShareDateBaseManger].db executeUpdate:sqlDelete, self.webPageId, self.titile, self.imageUrl, self.selectLike, self.selectStar];if (flag) {NSLog(@"删除数据成功");} else {NSLog(@"删除数据失败");}} else {NSLog(@"打开数据库失败");}
}

修改数据

修改数据的语句是一个update其实他和删除语句的大致类似,也是只要有一个属性和我们查找的内容相同就可以了,然后我们修改对应的一个属性值就可以了。

-(void)changeData {NSString* sqlDelete = @"update collectionCenter set (star) = (?) where (webPageId) = (?)";if ([[DataBaseManger ShareDateBaseManger].db open]) {BOOL flag = [[DataBaseManger ShareDateBaseManger].db executeUpdate:sqlDelete, @(self.selectStar), self.webPageId];if (flag) {NSLog(@"修改数据成功");} else {NSLog(@"修改数据失败");}} else {NSLog(@"打开数据库失败");}
}

以上代码就可以实现一个收藏中心的内容,我们只需要在详情页点击按钮之后进行一个数据内容的一个添加就可以了,添加的web的一个pageId和他的titile来对于数据进行一个判断就可以了,将点过赞和收藏过的页面都进行一个记录,然后下一次点击的时候在数据库中进行一个检索,如果点击过就设置一个对应的button的一个选中。

缓存高度数组

在评论区中因为采用的是一个自适应行高,当数据量太大时候会出现一个问题,就是每一个cell的height都要进行一次重复的运算,导致了很大程度上的一个性能开销,所以我们需要采用一个缓存高度数组的一个手段来解决,我们把加载过的cell高度全部存储在高度数组中,然后下一次使用的时候就到缓存过的高度数组中去获取,这样来减小一个性能上的一个开销。

-(NSMutableArray *)heightAry {if (_heightAry == nil) {_heightAry = [NSMutableArray array];[_heightAry addObject:[NSMutableDictionary dictionary]];[_heightAry addObject:[NSMutableDictionary dictionary]];}return _heightAry;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {if (self.heightAry[indexPath.section][@(indexPath.row)] ) {NSLog(@"%ld %ld 第几行第几列",indexPath.section, indexPath.row);return [self.heightAry[indexPath.section][@(indexPath.row)] doubleValue];} else {return UITableViewAutomaticDimension;}
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {if (!self.heightAry[indexPath.section][@(indexPath.row)] ) {NSLog(@"这%ld行没有存储过的一个高度", indexPath.row);id height = [NSNumber numberWithDouble:cell.frame.size.height];self.heightAry[indexPath.section][@(indexPath.row)] = height;} else {NSLog(@"这%ld行曾今存储过的一个高度", indexPath.row);NSLog(@"%@",  self.heightAry[indexPath.section][@(indexPath.row)]);return;}
}                                               

小结

大致也算是完成了知乎日报的内容,在学习的过程中出现很多问题,如对于MVC架构的一个职责不是很清楚,对于UITableVIew的函数调用的顺序不是很清楚,对于如何处理网络请求中异步回调的顺序问题,以及一些附加的功能还没有实现,比如说预加载和一个离线加载的内容,笔者会私下抽时间来实现这几个内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18210.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习实验十一 卷积神经网络(2)——基于LeNet实现手写体数字识别实验

目录 一、数据 二、模型构建 三、模型训练及评价 四、打印参数量和计算量 五、模型预测 附&#xff1a;完整可运行代码 实验大致步骤&#xff1a; 一、数据 下载网站&#xff1a;MNIST数据集 之前的官网不能下载数据集了&#xff0c;403了&#xff0c;所以找到一个类似…

Python语法便捷查询

一、Python基础语法&#xff1a; (1)注释&#xff1a; (2)标识符&#xff1a; 简介&#xff1a;标识符的格式限制和C语言一样 (3)字符串定义方法&#xff1a; (4)字符串拼接&#xff1a; (5)字符串的格式化&#xff08;占位拼接&#xff09;&#xff1a; 和C语言的printf类…

Ansys Maxwell - 3PH 感应电机 - 第 2 部分 - 机床工具包 ACT

本篇博文是“Ansys Maxwell&#xff1a;3PH 感应电机 - 力和热耦合”的延续。在本篇博文中&#xff0c;我将展示如何使用 Ansys Machine Toolkit ACT 开发扭矩与速度曲线&#xff08;一系列性能曲线&#xff0c;包括效率图&#xff09;&#xff0c;以评估在 Ansys Maxwell 中建…

【含开题报告+文档+PPT+源码】基于springboot的教师评价系统的设计与实现

开题报告 随着信息技术的迅猛发展&#xff0c;教育信息化已成为现代教育的必然趋势。教研室作为高校教学管理的重要机构&#xff0c;肩负着提升教学质量、推动教学改革的重要使命。然而&#xff0c;传统的教学管理方式往往存在效率低下、数据分散、管理不便等问题&#xff0c;…

用 Python 从零开始创建神经网络(八):梯度、偏导数和链式法则

梯度、偏导数和链式法则 引言1. 偏导数2. 和的偏导数3. 乘法的偏导数4. Max 的偏导数5. 梯度&#xff08;The Gradient&#xff09;6. 链式法则&#xff08;The Chain Rule&#xff09; 引言 在我们继续编写我们的神经网络代码之前&#xff0c;最后两个需要解决的难题是梯度和…

并查集 poj 2524,1611,1703,2236,2492,1988 练习集【蓝桥杯备赛】

目录 前言 并查集优势 Ubiquitous Religions poj 2524 问题描述 问题分析 代码 The Suspects poj 1611 问题描述 问题分析 代码 Wireless Network poj 2236 问题描述 问题分析 代码 分类 带权并查集合 权值树构建步骤 Find them, Catch them poj 1703 问题描述 问题分…

zabbix监控tomcat

1. 准备JDK环境 #vim /etc/profile export JAVA_HOME/usr/local/jdk export TOMCAT_HOME/usr/local/tomcat export PATH$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOMOE/bin [rootCentOS8 ~]# source /etc/profile [rootCentOS8 ~]# java -version openjdk version &q…

Nuget For Unity插件介绍

NuGet for Unity&#xff1a;提升 Unity 开发效率的利器 NuGet 是 .NET 开发生态中不可或缺的包管理工具,你可以将其理解为Unity的Assets Store或者UPM,里面有很多库可以帮助我们提高开发效率。当你想使用一个库,恰好这个库没什么依赖(比如newtonjson),那么下载包并找到Dll直接…

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台&#xff0c;专为团队协作设计。它类似于 Slack&#xff0c;提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎&#xff0c;因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

初识Linux—— 基本指令(上)

前言 Linux简述 ​ Linux是一种开源、自由、类UNIX的操作系统&#xff0c;由著名的芬兰程序员林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。Linux的内核在GNU通用公共许可证&#xff08;GPL&#xff09;下发布&#xff0c;这意味着任何人都可以自由…

VBA技术资料MF223:从文件添加新模块

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

利用RAGflow和LM Studio建立食品法规问答系统

前言 食品企业在管理标准、法规&#xff0c;特别是食品原料、特殊食品法规时&#xff0c;难以通过速查法规得到准确的结果。随着AI技术的发展&#xff0c;互联网上出现很多AI知识库的解决方案。 经过一轮测试&#xff0c;找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…

路径规划——RRT*算法

路径规划——RRT*算法 算法原理 RRT Star 算法是一种渐近最优的路径规划算法&#xff0c;它是 RRT 算法的优化版本。RRT Star 算法通过不断地迭代和优化&#xff0c;最终可以得到一条从起点到目标点的最优路径。 在学习RRT Star 算法之前最好先学习一下RRT原始算法&#xff1…

Java——并发工具类库线程安全问题

摘要 本文探讨了Java并发工具类库中的线程安全问题&#xff0c;特别是ThreadLocal导致的用户信息错乱异常场景。文章通过一个Spring Boot Web应用程序示例&#xff0c;展示了在Tomcat线程池环境下&#xff0c;ThreadLocal如何因线程重用而导致异常&#xff0c;并讨论了其他并发…

网络编程套接字

前言&#xff1a; 认识了网络&#xff0c;我们就应该考虑一下如何编程实现不同主机上的应用进程之间如何进行双向互通的端点。 套接字&#xff08;Socket&#xff09;是网络编程的一种基本概念&#xff0c;套接字是应用程序通过网络协议进行通信的接口&#xff0c;是操作系统提…

计算机网络:运输层 —— TCP 的拥塞控制

文章目录 TCP的拥塞控制拥塞控制的基本方法流量控制与拥塞控制的区别拥塞控制分类闭环拥塞控制算法 TCP的四种拥塞控制方法&#xff08;算法&#xff09;窗口慢开始门限慢开始算法拥塞避免算法快重传算法快恢复算法 TCP拥塞控制的流程TCP拥塞控制与网际层拥塞控制的关系 TCP的拥…

vue学习第8章(vue的购物车案例)

&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64f;&#x1f64f;&#x1f64f; 文章目录…

【SpringBoot】什么是Maven,以及如何配置国内源实现自动获取jar包

前言 &#x1f31f;&#x1f31f;本期讲解关于Maven的了解和如何进行国内源的配置~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f3…

【Linux】:进程信号(详谈信号捕捉 OS 运行)

✨ 来去都是自由风&#xff0c;该相逢的人总会相逢 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞…

七、利用CSS和多媒体美化页面的习题

题目一&#xff1a; 利用CSS技术&#xff0c;结合表格和列表&#xff0c;制作并美化 “ 翡翠阁 ”页面。运行效果如下 运行效果&#xff1a; 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>翡翠阁</title>&…