Delegate与Block的实现与联系

调试区gif图

代理与block的代码示例如下,记得要一一对应着看代码!!!
block方法:如果不用代理方法去执行的话那么就可以把代理方法用block传过去 ;
既然代理方法有两个一个是完成方法 , 一个是进度条方法 ,
那么block方法也应该传入2个block,progressBlockfinishBlock
代理列表中只有代理方法的声明 ,
1.谁用<XXXXXXDelegate>遵守我的代理方法 ;
2.谁实现了我的代理方法 ;
那么该对象 , 该类就成为了我的代理!

在block中打印方法或者对象可以捕获上下文 , 这是block的一个非常常用的功能!

main.m文件

#import <Foundation/Foundation.h>
#import "Cashier.h"
#import "Fruit.h"

#import "Downloader.h"
#import "DownloadDelegate.h"

@interface DownloaderImplementation : NSObject <DownloadDelegate>
@end

@implementation DownloaderImplementation

//实现两个代理方法之一:
- (void)downloadFinish {
    NSLog(@"下载完成") ;
}
//实现两个代理方法之二:
- (void)downloadingWithProgressPercent:(CGFloat)progress {
    NSLog(@"下载进度:%@" , @(progress)) ;
}

@end



int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //代理方法的调用:
        {
            DownloaderImplementation *helper = [[DownloaderImplementation alloc] init] ;
            Downloader *downloader = [[Downloader alloc] init] ;
            [downloader downloadWithHelper:helper] ;
        }
        

        //block方法的调用:
        {
            Downloader *downloader = [[Downloader alloc] init] ;
            [downloader downloadWithFinishedHandler:^{
                NSLog(@"下载完成") ;
            } andProgressHandler:^(CGFloat progress) {
                NSLog(@"下载进度: %@" , @(progress)) ;
            }] ;
        }
    }
    return 0;
}

DownloaderDelegate.h文件

#import <Foundation/Foundation.h>

@protocol DownloadDelegate <NSObject>
//代理方法:
- (void)downloadFinish ;
- (void)downloadingWithProgressPercent:(CGFloat)progress ;

@end

Downloader.h文件*



#import <Foundation/Foundation.h>
#import "DownloadDelegate.h"
@interface Downloader : NSObject
//代理方法:
- (void)downloadWithHelper:(id<DownloadDelegate>) helper ;

//block方法:
- (void)downloadWithFinishedHandler:(void (^) ())finishedHandler andProgressHandler:(void (^) (CGFloat progress))progressHandler ;

@end

Downloader.m文件


#import "Downloader.h"

@implementation Downloader

//代理方法的实现 :
- (void)downloadWithHelper:(id<DownloadDelegate>) helper {
    for (CGFloat progress = 0; progress <= 1.0; progress += 0.25) {
        sleep(1.0) ;
        [helper downloadingWithProgressPercent:progress] ;
        
    }
    [helper downloadFinish] ;
}

#pragma mark - block方法的实现
#warning
//block方法:如果不用代理方法去执行的话那么就可以把代理方法用block传过去 ;
//既然代理方法有两个一个是完成方法 , 一个是进度条方法 ,
//那么block方法也应该传入2个block,progressBlock 和 finishBlock:

//完成方法没有返回值 , 就是完成而已 ;
//完成方法只是打印 , 也没有参数 ;
//进度方法有参数无返回值 ;
- (void)downloadWithFinishedHandler:(void (^) ())finishedHandler andProgressHandler:(void (^) (CGFloat progress))progressHandler {
    for (CGFloat progress = 0; progress <= 1.0; progress += 0.25) {
        sleep(1.0) ;
        progressHandler(progress) ;
    }
    finishedHandler() ;
}

@end

愿编程让这个世界更美好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,851评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,337评论 19 139
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,313评论 30 472
  • 一、Objective-C发展史 Objective-C从1983年诞生,已经走过了30多年的历程。随着时间的推移...
    没事蹦蹦阅读 11,117评论 12 34
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,783评论 9 468