美文网首页
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