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;
}