iOS-block

block总结(温故而知新)

2016-02-18  本文已影响47人  HWenj

Block

block实际上是Objective-C语言对闭包的实现。

闭包(Closure)

闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。
闭包允许一个函数访问声明该函数运行上下文中的变量,以及不同运行上下文中的变了。

function funA(callback){
    alert(callback());
}
function funB(){
    var str = "Hello World"; // 函数funB的局部变量,函数funA的非局部变量
    funA(
        function(){
            return str;
        }
    );
}

因为闭包性,上面函数funA中的callback可以访问到funB中的变量str

Block
block的结构.png
//
//  ViewController.h
//  blockLearn
//
//  Created by xiaodoubaba on 16/2/10.
//  Copyright © 2016年 xiaodoubaba. All rights reserved.
//

#import <UIKit/UIKit.h>

//定义block类型
typedef int(^typedefBlock)(int);


@interface ViewController : UIViewController
//自定义类型的block
@property (copy, nonatomic) typedefBlock myBlock;

//block作为property 直接定义
@property (copy, nonatomic) NSString * (^propertyBlock)(int);

//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure;
@end

//
//  ViewController.m
//  blockLearn
//
//  Created by xiaodoubaba on 16/2/10.
//  Copyright © 2016年 xiaodoubaba. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self insideBlock];
    
    //property block的定义
    self.propertyBlock = ^(int num) {
        NSString *returnStr = [NSString stringWithFormat:@"passed num: %d",num];
        return returnStr;
    };
    self.propertyBlock(2);
    
    //可以用于不同页面间传值 将3传给其他页面
    self.myBlock(3);
    
    //调用外部block
    int outSideResult = outSideBlock(5);
    NSLog(@"outSideResult is %d", outSideResult);
    
    //调用外部返回对象
    NSString *strResult = returnString(@"World");
    NSLog(@"%@",strResult);
}

#pragma mark - 定义在方法内的Block
- (void)insideBlock{
    //无返回值无参数
    void (^noArgsNoReturn)() = ^(){
        NSLog(@"No Args And No Return");
    };
    //调用noArgsNoReturn
    noArgsNoReturn();
    
    //无返回值有参数
    void (^argsNoReturn)(int) = ^(int num){
        NSLog(@"%d",num);
    };
    //调用argsNoReturn
    argsNoReturn(9);
    
    //有返回值有参数
    int (^argsReturn)(int) = ^(int num){
        return num * 5;
    };
    //调用argsReturn
    int result = argsReturn(10);
    NSLog(@"result is %d",result);
}

#pragma mark - 定义在方法外的Block
//定义在方法外的
int (^outSideBlock)(int) = ^(int num) {
    return num * 5;
};

//返回对象
NSString* (^returnString)(NSString *) = ^(NSString *str) {
    NSString *joinStr = [NSString stringWithFormat:@"Hello %@",str];
    return joinStr;
};

#pragma mark - block做为函数参数
//当做函数参数作为callback 匿名block
+ (NSString *)callBackFunc:(int)age success:(void(^)(NSString *tip))success failure:(void(^)(NSError *error))failure
{
    NSString *str = [NSString stringWithFormat:@"%d",age];
    if (age >= 18) {
        NSString *string = [NSString stringWithFormat:@"年龄%d,已经成年了!",age];
        //成功回调
        success(string);
    }else{
        NSError *error = [NSError errorWithDomain:@"还未成年" code:0000 userInfo:nil];
        //失败回调
        failure(error);
    }
    return str;
}

#pragma mark - 作为参数bloc的使用
- (void)argsBlockExecute
{
    [ViewController callBackFunc:26 success:^(NSString *tip) {
        NSLog(@"我成年了!");
    } failure:^(NSError *error) {
        NSLog(@"我还年轻!");
    }];
}
@end
上一篇下一篇

猜你喜欢

热点阅读