用delegate实现下载功能:
1、delegate(代理模式)形式:
(1)数据回调 (2)事件分发 (3)数据配置
2、block 块
3、下载图片:
图1从上至下,如果是视频比较大的文件,会花大量时间停留于图中下载的黄色块中,等待下载结束再继续进行,为用户体验提供了不便。
一般是开辟新线程去做,这次我们使用delegate和block分别完成这个下载任务。
(1)使用delegate :图2 弥补上述缺点 模拟有一个下载任务,真正下载会让另外一个类执行下载,回调的数据用个delegate回调给我们
//
// main.m
// 下载2
//
// Created by tusm on 15-8-17.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "MainViewController.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
MainViewController *mvc=[[MainViewController alloc]init];
[mvc loadImage];
}
return 0;
}
//
// MainViewController.h
// 下载2
//
// Created by tusm on 15-8-17.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Downloader.h"
@interface MainViewController : NSObject <DownloaderDelegate>
-(void)loadImage;
@end
//
// MainViewController.m
// 下载2
//
// Created by tusm on 15-8-17.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "MainViewController.h"
@implementation MainViewController
//实现加载图片
-(void)loadImage{
Downloader *loader=[[Downloader alloc]init]; //创建对象
loader.delegate=self; // 到时候传递给我
[loader start];
}
//实现代理里的方法
-(void)downloadDidFinishedWithResults:(NSString *)str{
NSLog(@"模拟显示图片的工作");
NSLog(@"%@",str);
}
@end
//
// Downloader.h
// 下载2
//
// Created by tusm on 15-8-17.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol DownloaderDelegate <NSObject>//什么方式回调过去
-(void)downloadDidFinishedWithResults:(NSString *)str;//传个字符串(模拟二进制)做个数据的回调给调用者
@end
@interface Downloader : NSObject
//为啥是assign
@property (nonatomic,assign) id<DownloaderDelegate> delegate;
-(void)start;//启动这个下载
@end
//
// Downloader.m
// 下载2
//
// Created by tusm on 15-8-17.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "Downloader.h"
@implementation Downloader
-(void)start{
NSLog(@"开始下载");
NSLog(@"下载完毕");
if ([self.delegate respondsToSelector:@selector(downloadDidFinishedWithResults:)]) {
[self.delegate downloadDidFinishedWithResults:@"@__@"];
}
}
@end
代码结果:
用block实现下载功能:
//
// main.m
// block-下载
//
// Created by Baocloud-iMac8 on 15/8/2.
// Copyright (c) 2015年 宝擎教育. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "MainViewController.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MainViewController *mvc = [[MainViewController alloc] init];
[mvc loadImage];
}
return 0;
}
//
// MainViewController.h
// dowbn
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MainViewController : NSObject
//触发事件
-(void)loadImage;
@end
//
// MainViewController.m
// dowbn
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "MainViewController.h"
#import "Downloader.h"
@implementation MainViewController
-(void)loadImage{
//创建对象 调用方法
Downloader *loader=[[Downloader alloc]init];
[loader startWithBlock:^(NSString *results) {
NSLog(@"显示图片 %@",results);
}];//优点在于触发和实现在一起 调用这个数据(5,)的时候才会使用这个语句
//调用下载器,下载完毕传给我String类型的数据
// 用block实现下载
}
@end
//
// Downloader.h
// dowbn
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import <Foundation/Foundation.h>
//1.定义一个block类型 别名为ComlishBlock
typedef void(^ComlishBlock) (NSString *results);
@interface Downloader : NSObject
//2.定义一个方法 使用block作为参数 接收block
-(void)startWithBlock:(ComlishBlock)block;
@end
//
// Downloader.m
// dowbn
//
// Created by tusm on 15-9-10.
// Copyright (c) 2015年 tusm. All rights reserved.
//
#import "Downloader.h"
@interface Downloader()
//3.创建一个变量用来保存传递过来的block copy到堆上
//类型ComlishBlock 变量名block
@property (nonatomic,copy)ComlishBlock block;
@end
@implementation Downloader
-(void)startWithBlock:(ComlishBlock)block{
//4.保存这个block 保存到实例变量这个block上面去
self.block=block;
NSLog(@"请耐心等待");
//5.回调数据
self.block(@"周星驰"); //回调
}
@end