1.block用作屬性 封裝一段代碼
在模型類中聲明block屬性 ,注意block的屬性要使用copy否則會出問題
@property (copy, nonatomic) void (^actionBlock)();
@property (copy, nonatomic) void (^actionWithPapameterBlock)(int papameter);
@property (copy,nonatomic) NSString *(^actionToReturnStirng)();
其他控制器創建模型類對象,並且為block屬性賦予一段代碼 。曾經為cell的模型類添加了block屬性后,將點擊cell跳轉的控制器封裝到塊代碼中,調用起來十分方便。
//無返回值無參數block
_model = [[Modelalloc]init];
_model.actionBlock = ^{
NSLog(@"actionBlock");
};
//無返回值有參數block
_model.actionWithPapameterBlock = ^(int a){
NSLog(@"%d",a);
};
//有返回值
_model.actionToReturnStirng = ^{
return@"hello";
};
在其他方法中調用block
- (IBAction)tapBtn:(id)sender
{
_model.actionBlock();
_model.actionWithPapameterBlock(10);
NSLog(@"%@",_model.actionToReturnStirng());
}
2.控制器傳值
在需要傳值的控制器定義block,此處傳遞UITextField中輸入的NSString,並且聲明初始化方法
typedefvoid(^textFieldChangedBlock)(NSString *text);
-(id)initWithBlock:(textFieldChangedBlock)block;
實現文件中用成員變量記錄block
@implementation Model{
textFieldChangedBlock _changedBlock;
}
- (id)initWithBlock:(textFieldChangedBlock)block
{
self = [super init];
if (self) {
_changedBlock = block;
}
return self;
}
執行block
- (void)click
{ //返回
_changedBlock(self.textFiled.text);
[self dismissViewControllerAnimated:YES completion:nil];
}
Block傳值,在需要顯示textfield內容的控制器實例化存儲有block的類
DetailViewController *detail = [[DetailViewController alloc]initWithBlock:^(NSString *text) {
[self.label setText:text];
}];
3.曾在用sprite kit加載scene素材時用到了block
//主控制器中利用自定義scene提供的方法加載場景素材
[scene loadSceneAssetsWithCompletionHandler:^{
scene.scaleMode =SKSceneScaleModeAspectFill;
[skView presentScene:scene];
}];
// block實現
typedefvoid(^AssetLoadCompletionHandler)(void);
- (void)loadSceneAssetsWithCompletionHandler:(AssetLoadCompletionHandler)callback
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
[selfloadSceneAssets];
if (callback) {
dispatch_async(dispatch_get_main_queue(), ^{
callback();//回調
});
}
});
}
