「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]];
}


总结

首页的大部分已经完成,正在写单元格点击的响应事件。进度较慢,下星期尽量多写些。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGISPro】汉化嵌入的NoteBook界面

效果展示 下载Notebook汉化包 pip install jupyterlab-language-pack-zh-CN 添加环境变量 LANG zh_CN.UTF8 汉化结果

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息&#xff0c;那个检测能力超强的 WAF——长亭雷池&#xff0c;他推出免费社区版啦&#xff0c;体验地址见文末。 八年前我刚从学校毕业&#xff0c;在腾讯做安全研究&#xff0c;看到宇森在 BlackHat 上演讲的议题 《永别了&#xff0c;SQL 注入》 …

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…

scratch计算台阶 2024年9月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

目录 scratch计算台阶 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言&#xff0c;因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历

mysql死锁查看和解决

文章目录 一、MySQL死锁排查1、查看正在进行中的事务2、查看正在锁的事务3、查看等待锁的事务4、查询是否锁表5、查看最近死锁的日志6、杀死死锁 本文是基于Mysql8.0进行讲解。 本文只讲解如何查询数据库中是否有死锁及死锁的解决&#xff0c;若想了解更多关于死锁的信息&…

【STM32笔记】定时器(TIM1)无法工作

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 编译环境&#xff1a;keil uverison5 初次学习stm32&#xff08;stm32f103xx&#xff09;控制舵机&#xff08;mg90s&#xff09;时&#xff0c;舵机不转动&#xf…

Spark 程序开发与提交:本地与集群模式全解析

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 目录 一、本地开发与远程提交测试 &#xff08;一&#xff09;问题背景 &#xff08;二&#xff09;解决方案 集群环境准…

利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南

论文标题&#xff1a;A Comprehensive Guide on Data Acquisition Utilizing Amazon AWS IOT Core and MQTT 中文标题&#xff1a;利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南 作者信息&#xff1a; Tanishq. I. KohliPradip R. Selokar 两位作者均来自印度那格浦尔…

鸿萌数据迁移服务: 企业服务器整机在线热迁移, 实现不停机业务转移

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

软件工程笔记一

目录 软件的概念、特性和分类 软件与程序 软件的特性 软件的分类 软件危机与软件工程 软件危机 如何摆脱软件危机? 软件工程概念的提出 什么是软件工程&#xff1f; 软件工程的若干定义 系统工程的目标 软件工程的基本原理 软件工程的目标 软件的质量特性 软件生存…

使用VS Code 安装VUE.js开发环境的搭建并创建第一个项目

初步掌握VUE.js开发环境的搭建并创建第一个项目的操作方法和实验步骤 题目 安装Visual Studio Code。安装VS Code汉化插件。安装Vue官方支持插件。使用VS Code运行第一个HTML页面。安装Node.js并验证其版本。验证npm版本。配置npm的下载镜像源。配置Yarn的下载镜像源。使用Vi…

Java | Leetcode Java题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; class Solution {public String reverseStr(String s, int k) {int n s.length();char[] arr s.toCharArray();for (int i 0; i < n; i 2 * k) {reverse(arr, i, Math.min(i k, n) - 1);}return new String(arr);}public void reve…

【物联网技术】ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式介绍与AT指令介绍

前言:本文对ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式进行介绍;以及AT指令介绍,包括基础AT指令,WIFI功能AT指令、TCP/IP相关AT指令、常用AT指令实例进行介绍。 ESP8266 WIFI模块的接线及固件烧写可参考我的这篇博客:正点原子ATK-ESP8266 WIFI模块接线及固件…

【大数据学习 | kafka】kafka的数据存储结构

以上是kafka的数据的存储方式。 这些数据可以在服务器集群上对应的文件夹中查看到。 [hexuanhadoop106 __consumer_offsets-0]$ ll 总用量 8 -rw-rw-r--. 1 hexuan hexuan 10485760 10月 28 22:21 00000000000000000000.index -rw-rw-r--. 1 hexuan hexuan 0 10月 28 …

软件测试面试题——移动端

一、常用的adb命令有哪些&#xff1f; 命令含义adb devices展示当前电脑连接的设备&#xff0c;如果电脑上有多个手机&#xff0c;需要adb -s指定对应设备adb install xxx.apk直接安装xxx.apk到手机中&#xff0c;注意&#xff1a;必须打开手机设置里的USB安装adb install -r …

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

Perforce《2024游戏技术现状报告》Part2:游戏引擎、版本控制、IDE及项目管理等多种开发工具的应用分析

游戏开发者一直处于创新前沿。他们的实践、工具和技术受到各行各业的广泛关注&#xff0c;正在改变着组织进行数字创作的方式。 近期&#xff0c;Perforce发布了《2024游戏技术现状报告》&#xff0c;通过收集来自游戏、媒体与娱乐、汽车和制造业等高增长行业的从业者、管理人…

网站架构知识之密钥认证(day020)

1.密钥认证 两个节点&#xff0c;通过密钥形式进行访问&#xff0c;不要输入密码&#xff0c;单向。 应用场景&#xff1a;部分服务使用前要求我们做密钥认证。 1.使用rsa算法创建公钥私钥 ssh-keygen -t rsa /root/.ssh/id_rsa&#xff0c; 私钥地址 /root/.ssh/…

《重学Java设计模式》之 工厂方法模式

《重学Java设计模式》之 建造者模式 《重学Java设计模式》之 原型模式 《重学Java设计模式》之 单例模式 模拟发奖多种商品 工程结构 奖品发放接口 package com.yys.mes.design.factory.store;public interface ICommodity {/*** Author Sherry* Date 14:20 2024/11/6**/voi…