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

用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


代码结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值