调试区gif图
代理与block的代码示例如下,记得要一一对应着看代码!!!
block方法:如果不用代理方法去执行的话那么就可以把代理方法用block传过去 ;
既然代理方法有两个一个是完成方法 , 一个是进度条方法 ,
那么block方法也应该传入2个block,progressBlock
和finishBlock
代理列表中只有代理方法的声明 ,
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