您的位置:首页 > 其它

015.8.2 第七堂 delegate和block实现下载功能

2015-08-17 21:51 423 查看
用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




代码结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: