UIday1702:KVO 观察者设计模式 代码实现 常用

2024-04-08 04:58

本文主要是介绍UIday1702:KVO 观察者设计模式 代码实现 常用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

KVO 观察者设计模式 代码实现 常用


前提需要将之前编辑好的两个DownLoadTool文件拖过来

(DownLoadTool.h  DownLoadTool.m)


TableViewController.m

#import "TableViewController.h"
#import "TableViewCell.h"
#import "Model.h"
#import "DownLoadTool.h" @interface TableViewController ()@property(nonatomic,strong)NSMutableArray * dataArray;@end@implementation TableViewController- (void)viewDidLoad {[super viewDidLoad];//初始化数组self.dataArray = [NSMutableArray array];//请求数据[DownLoadTool downLoadWithURL:@"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/activitylist.php" method:@"GET" param:nil passValue:^(id value) {//解析数据NSDictionary * tempDict = [NSJSONSerialization JSONObjectWithData:value options:(NSJSONReadingAllowFragments) error:nil];for (NSDictionary * dict in tempDict[@"events"]) {Model * m = [[Model alloc]init];[m setValuesForKeysWithDictionary:dict];[self.dataArray addObject:m];}//更新数据[self.tableView reloadData];}];}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}#pragma mark - Table view data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
#warning Potentially incomplete method implementation.// Return the number of sections.return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
#warning Incomplete method implementation.// Return the number of rows in the section.return self.dataArray.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];//获取对应的model对象Model * m = self.dataArray[indexPath.row];//赋值cell.lab.text = m.title;//加载图片if (m.loadImage == nil && m.isLoading == NO) {//如果满足这个条件,说明图片可以显示//这种情况就启用占位图cell.imV.image = [UIImage imageNamed:@"000.png"];//加载图片数据[m downLoadImage];//添加观察者//__bridge_retained 桥接的作用将c语言转成OC[m addObserver:self forKeyPath:@"loadImage" options:(NSKeyValueObservingOptionNew) context:(__bridge_retained void *)(indexPath)];}else{//加载中//判断图片是否下载完成if (m.image == nil) {//如果未完成,使用占位符cell.imV.image = [UIImage imageNamed:@"000.png"];}else{//完成 就是用下载后的图片cell.imV.image = m.loadImage;}}return cell;
}//
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{// 1 拿到新值UIImage * newImage = change[NSKeyValueChangeNewKey];// 判空if ([newImage isEqual:[NSNull null]]) {return;}// 2 拿到当前显示的cell(index)NSArray * indexArray = [self.tableView indexPathsForVisibleRows];// 3 拿到刚请求到图片的cell的indexPath// __bridge NSIndexPath *NSIndexPath * indexPath = (__bridge NSIndexPath *)(context);// 4 判断是否正在显示if ([indexArray containsObject:indexPath]) {// 拿到cellTableViewCell * cell = (TableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];// 换图片cell.imV.image = newImage;}// 移除观察者[object removeObserver:self forKeyPath:@"loadImage"];}@end

TableViewCell.h

#import <UIKit/UIKit.h>@interface TableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *lab;
@property (weak, nonatomic) IBOutlet UIImageView *imV;@end

Model.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>@interface Model : NSObject@property(nonatomic,copy)NSString * image;
@property(nonatomic,copy)NSString * title;// 用来缓存图片
@property(nonatomic,strong)UIImage * loadImage;// 判断图片是否正在加载
@property(nonatomic,assign)BOOL isLoading;// 加载图片
-(void)downLoadImage;@end

Model.m

#import "Model.h"
#import "DownLoadTool.h"@implementation Model-(void)downLoadImage{[DownLoadTool downLoadWithURL:_image method:@"GET" param:nil passValue:^(id value) {self.loadImage = [UIImage imageWithData:value];//加载完成 (意味着不在加载中)_isLoading = NO;}];// 加载中_isLoading = YES;}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}@end



这篇关于UIday1702:KVO 观察者设计模式 代码实现 常用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884624

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形