iOS Block

120 阅读2分钟

Block声明

返回值类型(^block变量名)(参数列表)

示例:

返回值类型(^block变量名)(参数列表)
 
int(^personBlock)(NSString *,int)
 
返回值类型:int
block变量名: personBlock
参数列表:NSString *,int 
(注意:参数列表只需要写参数类型,不需要写参数名,例如:NSString * name 的写法是不对的,不需要写参数名name)
  //声明一个空返回值,没有参数的block
   void (^aBlock)(void) 
 
   //声明一个空返回值,参数有NSString *,NSString *,NSString *,int 的block
   void(^bBlock)(NSString *,NSString *,NSString *,int);
    
   //声明一个返回类型为NSString,参数有int 的block
   NSString* (^cBlock)(int) 

Block的声明+定义+实现

定义:

返回值类型(^block变量名)(参数列表) = ^(参数列表) {
 
};

声明局部变量的Block

- (void)viewDidLoad 
{
    [super viewDidLoad];
    
 
NSString * (^personBlock)(NSString *,int) = ^(NSString * name, int age){
        
        NSLog(@"年龄==%d",age);
        
        return name;
    };
    
    //实现
    NSString * name = personBlock(@"zhangsan",29);
    
    NSLog(@"姓名==%@",name);
 
}

声明全局的Block得用别名 typedef 的方式声明,与 @property 声明变量的方式差不多,例如:

#import "ViewController.h"
 
//使用别名的方式声明一个block
typedef void(^ PersonBlock) (int,NSString *);
 
@interface ViewController ()
 
 
@end

Block使用场景

用作参数

不带参数的 block

#import <Foundation/Foundation.h>

@interface DemoClass : NSObject

- (void)performActionWithBlock:(void (^)(void))actionBlock;

@end

@implementation DemoClass

- (void)performActionWithBlock:(void (^)(void))actionBlock {
    NSLog(@"Action started.");
    if (actionBlock) {
        actionBlock(); // 执行传递进来的 block
    }
    NSLog(@"Action completed.");
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        DemoClass *demo = [[DemoClass alloc] init];
        [demo performActionWithBlock:^{
            NSLog(@"Block is being executed!");
        }];
    }
    return 0;
}

带参数的 block

#import <Foundation/Foundation.h>

@interface GreetingClass : NSObject

- (void)greetWithName:(void (^)(NSString *name))greetBlock;

@end

@implementation GreetingClass

- (void)greetWithName:(void (^)(NSString *name))greetBlock {
    NSString *name = @"Alice";
    if (greetBlock) {
        greetBlock(name);
    }
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        GreetingClass *greeter = [[GreetingClass alloc] init];
        [greeter greetWithName:^(NSString *name) {
            NSLog(@"Hello, %@", name);
        }];
    }
    return 0;
}

带返回值的 block

#import <Foundation/Foundation.h>

@interface CalculatorClass : NSObject

- (void)computeWithBlock:(int (^)(int a, int b))operationBlock;

@end

@implementation CalculatorClass

- (void)computeWithBlock:(int (^)(int a, int b))operationBlock {
    int result = operationBlock ? operationBlock(3, 4) : 0;
    NSLog(@"The result of the operation is: %d", result);
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        CalculatorClass *calculator = [[CalculatorClass alloc] init];
        [calculator computeWithBlock:^int(int a, int b) {
            return a + b; // 添加
        }];
    }
    return 0;
}

异步任务中的 block

#import <Foundation/Foundation.h>

@interface NetworkRequest : NSObject

- (void)fetchDataWithCompletion:(void (^)(NSData *data, NSError *error))completionHandler;

@end

@implementation NetworkRequest

- (void)fetchDataWithCompletion:(void (^)(NSData *data, NSError *error))completionHandler {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 模拟网络延迟
        [NSThread sleepForTimeInterval:2];
        NSData *data = [@"Sample response data" dataUsingEncoding:NSUTF8StringEncoding];
        
        if (completionHandler) {
            completionHandler(data, nil);
        }
    });
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NetworkRequest *networkRequest = [[NetworkRequest alloc] init];
        [networkRequest fetchDataWithCompletion:^(NSData *data, NSError *error) {
            if (error) {
                NSLog(@"An error occurred: %@", error);
            } else {
                NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                NSLog(@"Received data: %@", responseString);
            }
        }];
        
        // 保持主运行循环以等待异步任务完成
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}