文档章节

UI_18 图片异步下载、KVO

黑伞将军
 黑伞将军
发布于 2015/09/08 22:34
字数 1146
阅读 87
收藏 4

一、异步下载图片ImageViewDownloader

     图⽚下载是iOS开发中常⽤的功能,但系统并未提供图⽚下载类。 为了便于后续使⽤,可以将图⽚下载封装到⼀个类⾥⾯ (ImageDownloader)

     新建SingleViewApplication,使用默认的Storyboard,向其中添加一个Button一个ImageView并关联属性、添加事件。点击Button实现异步下载并显示图片。AsynImageDownloader类封装了下载图片的方法。

使用代理进行AsynImageDownloader与ViewController中的传值(UIImage)

AsynImageDownloaderDelegate.h

#import <Foundation/Foundation.h>
@class UIImage;
@class AsynImageDownloader;

@protocol AsynImageDownloaderDelegate <NSObject>

- (
void)AsynImageDownloader:(AsynImageDownloader *)downloader isLoading:(UIImage *)image;

@end


封装图片下载的方法

AsynImageDownloader.h

#import <Foundation/Foundation.h>
#import
"AsynImageDownloaderDelegate.h"

@interface AsynImageDownloader : NSObject<NSURLConnectionDataDelegate>

@property (nonatomic, assign) id<AsynImageDownloaderDelegate> delegate;

@property (nonatomic, retain) NSURLConnection *connection;

- (
instancetype)initWithImageURL:(NSString *)imageURL;


@end


AsynImageDownloader.m

#import "AsynImageDownloader.h"
#import
<UIKit/UIKit.h>

@interface AsynImageDownloader ()
@property (nonatomic, retain) NSMutableData *receiveData;
@end

@implementation AsynImageDownloader

- (
instancetype)initWithImageURL:(NSString *)imageURL
{
   
self = [super init];
   
if (self) {
       
//1.URL
       
NSURL *url = [NSURL URLWithString:imageURL];
       
//2.request
       
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
       
//3.connection OBJ
       
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    }
   
return self;
}

- (
void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
   
self.receiveData = [NSMutableData data];
}

- (
void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [
_receiveData appendData:data];
   
UIImage *image = [UIImage imageWithData:_receiveData];
   
if ([_delegate respondsToSelector:@selector(AsynImageDownloader:isLoading:)]) {
        [
_delegate AsynImageDownloader:self isLoading:image];
    }
}


@end


创建对象并显示图片,遵守协议、设置代理

ViewController.m

#import "ViewController.h"

#import "AsynImageDownloader.h"
#import
"AsynImageDownloaderDelegate.h"

#define kPicURL @"http://image.zcool.com.cn/56/13/1308200901454.jpg"

@interface ViewController ()<NSURLConnectionDataDelegate, AsynImageDownloaderDelegate>
@property (nonatomic, retain) NSMutableData *receiveData;

@property (retain, nonatomic) IBOutlet UIImageView *imgView;

- (
IBAction)asynDownloaderPic:(UIButton *)sender;
@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
// Do any additional setup after loading the view, typically from a nib.
}

- (
void)didReceiveMemoryWarning {
    [
super didReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
}

#pragma mark -- AsynImageDownloaderDelegate --
- (void)AsynImageDownloader:(AsynImageDownloader *)downloader isLoading:(UIImage *)image
{
   
self.imgView.image = image;
}

#pragma mark -- 异步下载图片 --

- (IBAction)asynDownloadPic:(UIButton *)sender {

    AsynImageDownloader *downloader = [[AsynImageDownload alloc] initWithImageURL:kPicURL];

    downloader.delegate = self;
}

- (
void)dealloc {
    [
_imgView release];
    [
super dealloc];
}

@end


二、KVO(Key-Value-Observer 键值观察者)

1、KVO简介

     KVO是观察者设计模式的⼀种具体实现

     在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步。这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映模型的变化;当用户和控制器交互的时候,模型也应该做出相应的改变。

     KVO 能帮助我们让视图和模型保持同步。控制器可以观察视图依赖的属性变化。MVC中M与C通信,M发⽣变化通知C。其中M是被 观察者,C是观察者。

     KVO触发机制:⼀个对象(观察者),监测另⼀对象(被观察者)的某属性是否发⽣变化,若被监测的属性发⽣的更改,会触发观察者的⼀个⽅法(⽅法名固定,类似代理⽅法)

KVO详细介绍及使用:http://objccn.io/issue-7-3/

2、KVO使⽤步骤

1、注册观察者(为被观察者指定观察者以及被观察属性)

2、实现回调⽅法

3、触发回调⽅法(被观察属性发⽣更改)

4、移除观察者

3、使用示例

示例一

     给Person类的name属性添加观察者。name发⽣变化 时,让self.view的背景颜⾊随机改变。界面包含一个UITextField、一个UIButton。使用SingleViewApplication创建,在Storyboard中添加控件

YFPerson.h

#import <Foundation/Foundation.h>

@interface YFPerson : NSObject

@property (nonatomic, retain) NSString *name;

@end

ViewController.m

#import "ViewController.h"
#import
"YFPerson.h"

@interface ViewController ()
@property (nonatomic, retain) YFPerson *person;
@property (retain, nonatomic) IBOutlet UITextField *textField;

- (
IBAction)didClickButton:(UIButton *)sender;
@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
   
self.person = [[YFPerson alloc] init];
   
//1.注册观察者(为被观察者_person添加一个观察者self并设置其观察的属性)
    [
_person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    [
_person release];
   
   
// Do any additional setup after loading the view, typically from a nib.
}

- (
IBAction)didClickButton:(UIButton *)sender {
   
   
//3.1改变Person.name
   
_person.name = _textField.text;
   
}
//3.2被观察者属性改变触发以下方法
//2.实现回调方法
- (
void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
   
NSLog(@"被观察者的路径:%@",keyPath);
   
NSLog(@"被观察者:%@", object);                    //object为被观察者
   
NSLog(@"被监测的属性所有状态下的值:%@", change);     //change {kind=1; new=""; old="<null>"}
   
NSLog(@"在注册观察者时,context的值:%@", context);  //context
   
   
//判断新值和旧值
   
if (![change[@"new"]isEqualToString:change[@"old"]]) {
       
self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0];
    }
   
}

- (
void)dealloc {
   
//4.移除观察者
    [
_person removeObserver:self forKeyPath:@"name" context:nil];
    [
_textField release];
    [
super dealloc];
}

@end

示例二

KVO监测Model图⽚下载

https://github.com/zooyf/KVO-Monitoring-Model-Picture-Download



附,第三方框架

文件下载

如果文件比较小,下载方式会比较多

直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;

利用NSURLConnection发送一个HTTP请求去下载

如果是下载图片,还可以利用SDWebImage框架

文件压缩解压框架

第三方解压缩框架——SSZipArchive

下载地址:https://github.com/samsoffes/ssziparchive

注意:需要引入libz.dylib框架 

// Unzipping

NSString *zipPath = @"path_to_your_zip_file";

NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";

[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];

// Zipping

NSString *zippedPath = @"path_where_you_want_the_file_created";

NSArray *inputPaths = [NSArray arrayWithObjects:

                       [[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],

                       [[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]

                       nil];

[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];

部分文件的MIMEType


© 著作权归作者所有

黑伞将军
粉丝 1
博文 33
码字总数 34553
作品 0
张家口
程序员
私信 提问
多线程的底层实现机制

1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开...

万能的匹诺曹
2016/06/22
43
0
iOS开发常用技术底层实现(精简概述)

(1)RunTime总结: oc动态性, 运行时将代码转化为runtime的C代码 RunTime运行流程: 生成对应objc_msgSend方法 isa指针查看当前类有没有这个方法, 之后寻找父类, 每个方法SEL(方法选择器)对应I...

铁头娃_e245
2018/07/08
0
0
iOS面试题总结(三)

iOS面试(三) 1.MVC具有什么样的优势,各个模块之间怎么通信,比如Button后怎么通知Model MVC是一种设计思想,是一种架构模式,是一种把应用所有类组织起来的策略。他们把程序分成3块。 M: 存储...

沧州宁少
2017/12/06
0
0
AsyncTask用法和异步加载图片

AsyncTask:是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。 As...

切切歆语
2016/11/16
10
0
响应式编程框架ReactiveCocoa介绍与入门

版权声明:本文为博主原创文章,欢迎分享到其它技术社区,分享请标明出处: https://blog.csdn.net/CHENYUFENG1991/article/details/51470316 ReactiveCocoa是Github团队开发的第三方函数式响...

乞力马扎罗的雪CYF
2016/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部