[iOS]知乎日报第一周总结-就喜欢夜袭寡妇村
文章目录
小结
昨晚总算开始写了 拖延症太严重了T-T
了解了SDWebImage库的一些简单的使用
学习了JSONModel库的一些简单的使用
完成了知乎日报主页简单的布局
通过pod安装这些库
和Masonry库的安装一样
先 command + BLANK 打开搜索
然后输入 terminal 打开你的终端
对的我在水字数
切换到文件目录下
cd 文件路径
创建并通过 vim 编辑 Podfile 文本
vim Podfile
编辑什么内容?
platform :ios, ‘8.0’
target '文件名’ do
pod ‘要安装的库的名称’
end
通过我们的cocoapod开始下载
pod install
然后打开你的 .workingspace 文件就可以开始写了
我有一点问题
那怎么给我的项目同时安装多个库
我先安装了JSONModel 库再安装SDWebImage 库的时候
我的 JSONModel 库被删了
这是为什么?是要什么特殊的语法吗?
其实不然
pod 是按你的 Podfile 文件下的
所以应该在 Podfile 文件内多加一行 pod
platform :ios, ‘8.0’
target '文件名’ do
pod ‘要安装的库1的名称’
pod ‘要安装的库2的名称’
end
JSONModel 库简单使用
提前准备
首先要有一个JSONModel的子类
然后把你要获取的东西设为属性
这里放一个参考的JSON数据 当然是和下面的配套啦
{"date":"20231023","stories":[{"image_hue":"0x22b3b0","title":"为什么可以通过细胞外液是盐溶液判断生命起源于海洋?","url":"https:\/\/daily.zhihu.com\/story\/9766588","hint":"赵泠 · 3 分钟阅读","ga_prefix":"102307","images":["https:\/\/pic1.zhimg.com\/v2-8d8a23e31074b7de5e35f4f76d18efeb.jpg?source=8673f162"],"type":0,"id":9766588},{"image_hue":"0x919995","title":"PDF 格式的文件编辑难度非常大,相比 docx 格式它存在的意义是什么?","url":"https:\/\/daily.zhihu.com\/story\/9766598","hint":"神们自己 · 2 分钟阅读","ga_prefix":"102307","images":["https:\/\/picx.zhimg.com\/v2-7dc4e0f0603385bc99ecc898e01f260e.jpg?source=8673f162"],"type":0,"id":9766598},{"image_hue":"0x4079b3","title":"虚数在物理中有什么应用吗?","url":"https:\/\/daily.zhihu.com\/story\/9766599","hint":"哈维 · 1 分钟阅读","ga_prefix":"102307","images":["https:\/\/pica.zhimg.com\/v2-b222b3bd17c5975c982fca802185d2bd.jpg?source=8673f162"],"type":0,"id":9766599},{"image_hue":"0x50a92e","title":"回顾精灵宝可梦的发展历史,是什么给了作者灵感而创作出如此脍炙人口的作品呢?","url":"https:\/\/daily.zhihu.com\/story\/9766602","hint":"疯癫的A兵者 · 5 分钟阅读","ga_prefix":"102307","images":["https:\/\/pic1.zhimg.com\/v2-622d5da24252cc9f662f0e847c57fb8a.jpg?source=8673f162"],"type":0,"id":9766602},{"image_hue":"0x916863","title":"瞎扯 · 如何正确地吐槽","url":"https:\/\/daily.zhihu.com\/story\/9766611","hint":"VOL.3218","ga_prefix":"102306","images":["https:\/\/pic1.zhimg.com\/v2-dbf246a323eff408ece4e6f47ca2f7ff.jpg?source=8673f162"],"type":0,"id":9766611}],"top_stories":[{"image_hue":"0x22b3b0","hint":"作者 \/ 赵泠","url":"https:\/\/daily.zhihu.com\/story\/9766588","image":"https:\/\/picx.zhimg.com\/v2-ca7a312c417c6a90ec32d87a39f29484.jpg?source=8673f162","title":"为什么可以通过细胞外液是盐溶液判断生命起源于海洋?","ga_prefix":"102307","type":0,"id":9766588},{"image_hue":"0x925533","hint":"作者 \/ 田可乐","url":"https:\/\/daily.zhihu.com\/story\/9766586","image":"https:\/\/pic1.zhimg.com\/v2-ba507aaaa70eccd2d65652a4c426f6b4.jpg?source=8673f162","title":"小事 · 你在大学经历哪些后悔的事?","ga_prefix":"102207","type":0,"id":9766586},{"image_hue":"0xb38760","hint":"作者 \/ 匿名用户","url":"https:\/\/daily.zhihu.com\/story\/9766552","image":"https:\/\/picx.zhimg.com\/v2-9884fbee2990fd1532e6524aba2b2c87.jpg?source=8673f162","title":"小事 · 哪一刻让你觉得世人皆苦?","ga_prefix":"102107","type":0,"id":9766552},{"image_hue":"0x9e8b6f","hint":"作者 \/ 小铖","url":"https:\/\/daily.zhihu.com\/story\/9766510","image":"https:\/\/picx.zhimg.com\/v2-270e008e2e0db841ddeb3ceb97431d22.jpg?source=8673f162","title":"为什么南方少数民族喜欢佩戴银饰?","ga_prefix":"102007","type":0,"id":9766510},{"image_hue":"0x9b784c","hint":"作者 \/ 烫手的洋芋","url":"https:\/\/daily.zhihu.com\/story\/9766462","image":"https:\/\/pic1.zhimg.com\/v2-1f27632b932e5c5491889c5d0cf36af2.jpg?source=8673f162","title":"不是很懂相位对焦,为什么无反要在 cmos 上埋对焦点?而不直接用像素检测?","ga_prefix":"101907","type":0,"id":9766462}]}
然后要设置的子类如下
//JSONModel.h
@protocol Top_storiesJSONModel
@end
@protocol StoriesJSONModel
@end
@interface Top_storiesJSONModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *imageStr;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *ID;
@end
@interface StoriesJSONModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSArray *images;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *ID;
@end
@interface FIrstJSONModel : JSONModel
@property (nonatomic, copy) NSString *data;
@property (nonatomic, copy) NSArray<StoriesJSONModel>*stories;
@property (nonatomic, copy) NSArray<Top_storiesJSONModel>*top_stories;
@end
上面展示了嵌套的写法
JSONModel的作用说白了就是将JSON数据依照关键字,变成一个类的属性, 方便使用, 它的强大之处在于能够完成数据形式的转换
在嵌套数据时, 我们应该对每一个要嵌套的都写成一个类,但并不是意味着要写成多个类文件,而是只需要在一个类文件里把该有的写好就行
然后注意不要在你的这个漏了@protocol Top_storiesJSONModel和@protocol StoriesJSONModel
获取数据
有个问题 如果我直接就没给某个数据怎么办
就是 它可有可无我不一定能收到
我要眼看着它会报错还要设置它吗?
聪明的小同学想起来
我们可以给属性设置optional关键字
还有其他方法吗
对的 来看一个‘方法’
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
就是这样了 这个类方法可以让你这个类实例的所有属性都可以是不必须的
请求数据
反正我是这么写的
还是很熟悉的五步走 只是变方便了许多
就不赘述了
- (void)loadJSONModel {
NSString *urlString = [NSString stringWithFormat:@"%@",@"https://news-at.zhihu.com/api/4/news/latest"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30.0];
[request setHTTPMethod:@"GET"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
self.dataArray = [NSMutableArray array];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"Httperror: %@%ld", error.localizedDescription, error.code);
} else {
if (data) {
FIrstJSONModel* model = [[FIrstJSONModel alloc] initWithData:data error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", [model.stories[0] title]);
});
}
}
}];
[dataTask resume];
}
加了JSONModel库后也就是加了下面这一句
比较关键的处理
也能看出来 比以前介绍的数据处理方便了好多
FIrstJSONModel* model = [[FIrstJSONModel alloc] initWithData:data error:nil];
处理数据
比如我想要这个数据里面的images
然后我发现 实例.top_stroies[0].images直接爆红了
那怎么获取到呢?
法一:通过get方法获取
[newsModel.top_stories[0] images];
法二:将实例.top_stroies[0]赋值给一个数组 再从数组中取出images
这个就不写了
SDWebImage 库简单使用
SDWebImage是一个常用的第三方库,用于在iOS应用中异步加载和缓存网络图片。以下是使用SDWebImage库的一般步骤:
异步加载图片
使用SDWebImage提供的方法来异步加载网络图片
以下是一个示例
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, width, height)];
NSString *imageUrl = @"http://example.com/image.jpg";
// 使用SDWebImage异步加载图片
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl]
placeholderImage:[UIImage imageNamed:@"placeholder"]];
在上面的示例中 sd_setImageWithURL: 方法将会异步加载指定URL的图片 并在加载过程中显示一个占位图片
图片缓存
SDWebImage还提供了图片缓存的功能可以自动将下载的图片缓存在本地
以下是一个示例
NSString *imageUrl = @"http://example.com/image.jpg";
// 检查缓存中是否存在图片
BOOL isCached = [[SDWebImageManager sharedManager] cachedImageExistsForURL:[NSURL URLWithString:imageUrl]];
// 从缓存中获取图片
UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:imageUrl];
在上面的示例中, cachedImageExistsForURL: 方法用于检查缓存中是否存在指定URL的图片,imageFromCacheForKey: 方法用于从缓存中获取指定URL的图片。
获取图片
如果你只需要获取图片 而不需要将其设置为UIImageView的image属性
可以使用SDWebImage提供的sd_imageURL方法来获取图片的URL
然后使用其他方法来下载或处理图片。
NSString *imageUrl = @"http://example.com/image.jpg";
// 获取图片的URL
NSURL *imageURL = [NSURL URLWithString:imageUrl];
// 下载图片
[[SDWebImageManager sharedManager] loadImageWithURL:imageURL options:SDWebImageRefreshCached progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (error) {
NSLog(@"Failed to load image: %@", error);
} else {
NSLog(@"Image loaded successfully");
}
}];
这些只是SDWebImage库的一些基本用法
它还提供了如图片下载进度、图片渐进式加载、图片处理等其他一些功能
你可以查阅SDWebImage的官方文档以获取更详细的使用说明和示例代码
还有一个问题
就是
就是
就是首页那个可以一直下拉获取数据的tableView要怎么搞?
聪明的同学都知道 咱这个 tableView 是要提前设置行数和组数的
那我们只能在下滑到最后的时候重新请求下面的数据 然后来一句
[self.tableView reload]
具体怎么来?
法一:设置最后一个cell为正在加载的图标或者示意
设置最后一个cell为正在加载的图标或者示意
然后加载到它的时候 或者判断划到最后的时候请求新的数据
请求完就重新加载咱的tableView
这个还没写呢 写完贴代码
法二:快划到底前就请求数据
咱主打一个悄悄滴进村 打枪的不要
可以通过实现UITableViewDelegate的scrollViewDidScroll方法来实现无限加载功能
在UIViewController或UITableViewController中添加一个属性来跟踪当前加载的页数和数据
@property (nonatomic, assign) NSInteger currentPage;
@property (nonatomic, strong) NSMutableArray *dataArray;
在viewDidLoad方法中初始化属性和设置UITableView的代理
- (void)viewDidLoad {
[super viewDidLoad];
self.currentPage = 1; // 初始化当前页数为1
self.dataArray = [NSMutableArray array]; // 初始化数据数组
self.tableView.delegate = self; // 设置UITableView的代理
}
实现scrollViewDidScroll方法来检测UITableView滚动到底部的事件
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat contentHeight = scrollView.contentSize.height;
CGFloat scrollViewHeight = scrollView.frame.size.height;
if (offsetY > contentHeight - scrollViewHeight) {
// 当滚动到底部时,加载更多数据
[self loadMoreData];
}
}
在loadMoreData方法中执行加载更多数据的操作
如从服务器请求下一页数据并将其添加到dataArray中然后刷新UITableView:
- (void)loadMoreData {
self.currentPage++; // 增加当前页数
// 从服务器请求下一页数据
// ...
// 将新数据添加到dataArray中
[self.tableView reloadData]; // 刷新UITableView
}
这样当我们滚动到UITableView的底部时loadMoreData方法会被调用
加载更多数据并刷新UITableView显示新数据
好了不说了 补作业去了T-T