block、delegate
1.delegate 運行成本低 block 運行成本高
2.delegate 更安全、不會出現循環引用 可以支持多個方法 但回調返回參數限制於ns類
3.block 系統再帶動畫 可讀性高,只要實現就可以了不用設置代理、實現方法
4.block 本質就是個對象 能當做屬性、成員變量傳遞 afnetworking、gcd都用block
一、block 使用
1.定義 typedef void(^resultBlock)(BOOL success);
返回值 無,block名 resultBlock,參數 success
使用
+(void)saveImageToSandbox:(UIImage *)image
andImageNage:(NSString *)imageName
andResultBlock:(resultBlock)block;
#pragma mark----將照片保存到沙盒
+(void)saveImageToSandbox:(UIImage *)image andImageNage:(NSString *)imageName andResultBlock:(resultBlock)block
{
//高保真壓縮圖片,此方法可將圖片壓縮,但是圖片質量基本不變,第二個參數爲質量參數
NSData *imageData=UIImageJPEGRepresentation(image, 0.5);
//將圖片寫入文件
NSString *filePath=[self filePath:imageName];
//是否保存成功
BOOL result=[imageData writeToFile:filePath atomically:YES];
//保存成功傳值到blcok中
if (result) {
block(result);
}
}
//保存到沙盒中
[SZKImagePickerVC saveImageToSandbox:image andImageNage:imageName andResultBlock:^(BOOL success) {
NSLog(@"保存成功");
}];
2.定義
typedef void(^selectPrcvinceBlock)(CCarNumTableViewCell *);
使用
@property (nonatomic,copy) selectPrcvinceBlock selectPrcvinceBlock;
- (IBAction)selectProvince:(id)sender {
if (self.selectPrcvinceBlock) {
self.selectPrcvinceBlock(self);
}
}
二、delegate 代理
定義
@protocol BackMessageViewDelegate <NSObject>
- (void)clickSaveBtn;
- (void)clickCancleBtn;
@end
使用
@property (nonatomic,weak) id<BackMessageViewDelegate> delegate;
- (IBAction)clickSaveBtn:(id)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(clickSaveBtn)]) {
[self.delegate clickSaveBtn];
}
}
三、notification通知
舉例:監聽鍵盤顯示、隱藏 移動View的frame使用