美文网首页
Delegate与Block的实现与联系

Delegate与Block的实现与联系

作者: 小苗晓雪 | 来源:发表于2017-04-11 17:01 被阅读9次
调试区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

愿编程让这个世界更美好

相关文章

网友评论

      本文标题:Delegate与Block的实现与联系

      本文链接:https://www.haomeiwen.com/subject/byduattx.html