Jac*_*nkr 137 objective-c objective-c-blocks
我怎样才能传递Block到Function/ Method?
我尝试- (void)someFunc:(__Block)someBlock无济于事.
即.什么类型的Block?
Jon*_*pan 248
块的类型取决于其参数及其返回类型.在一般情况下,块类型的声明方式与函数指针类型相同,但替换为*a ^.将块传递给方法的一种方法如下:
- (void)iterateWidgets:(void (^)(id, int))iteratorBlock;
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的那样,这很麻烦.您可以改为使用a typedef来使块类型更清晰:
typedef void (^ IteratorBlock)(id, int);
Run Code Online (Sandbox Code Playgroud)
然后将该块传递给类似的方法:
- (void)iterateWidgets:(IteratorBlock)iteratorBlock;
Run Code Online (Sandbox Code Playgroud)
Enr*_*iMR 58
这个问题最简单的解释是遵循以下模板:
1.阻止作为方法参数
模板
- (void)aMethodWithBlock:(returnType (^)(parameters))blockName {
// your code
}
Run Code Online (Sandbox Code Playgroud)
例
-(void) saveWithCompletionBlock: (void (^)(NSArray *elements, NSError *error))completionBlock{
// your code
}
Run Code Online (Sandbox Code Playgroud)
案件的其他用途:
2.作为财产阻止
模板
@property (nonatomic, copy) returnType (^blockName)(parameters);
Run Code Online (Sandbox Code Playgroud)
例
@property (nonatomic,copy)void (^completionBlock)(NSArray *array, NSError *error);
Run Code Online (Sandbox Code Playgroud)
3.阻止作为方法参数
模板
[anObject aMethodWithBlock: ^returnType (parameters) {
// your code
}];
Run Code Online (Sandbox Code Playgroud)
例
[self saveWithCompletionBlock:^(NSArray *array, NSError *error) {
// your code
}];
Run Code Online (Sandbox Code Playgroud)
4.阻止作为局部变量
模板
returnType (^blockName)(parameters) = ^returnType(parameters) {
// your code
};
Run Code Online (Sandbox Code Playgroud)
例
void (^completionBlock) (NSArray *array, NSError *error) = ^void(NSArray *array, NSError *error){
// your code
};
Run Code Online (Sandbox Code Playgroud)
5.阻止作为typedef
模板
typedef returnType (^typeName)(parameters);
typeName blockName = ^(parameters) {
// your code
}
Run Code Online (Sandbox Code Playgroud)
例
typedef void(^completionBlock)(NSArray *array, NSError *error);
completionBlock didComplete = ^(NSArray *array, NSError *error){
// your code
};
Run Code Online (Sandbox Code Playgroud)
qua*_*tym 51
这可能会有所帮助:
- (void)someFunc:(void(^)(void))someBlock;
Run Code Online (Sandbox Code Playgroud)
Ale*_*aev 23
您可以这样做,将块作为块参数传递:
//creating a block named "completion" that will take no arguments and will return void
void(^completion)() = ^() {
NSLog(@"bbb");
};
//creating a block namd "block" that will take a block as argument and will return void
void(^block)(void(^completion)()) = ^(void(^completion)()) {
NSLog(@"aaa");
completion();
};
//invoking block "block" with block "completion" as argument
block(completion);
Run Code Online (Sandbox Code Playgroud)
在下面的示例中使用с函数传递块的另一种方法.我创建了在后台和主队列中执行任何操作的函数.
blocks.h文件
void performInBackground(void(^block)(void));
void performOnMainQueue(void(^block)(void));
Run Code Online (Sandbox Code Playgroud)
blocks.m文件
#import "blocks.h"
void performInBackground(void(^block)(void)) {
if (nil == block) {
return;
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), block);
}
void performOnMainQueue(void(^block)(void)) {
if (nil == block) {
return;
}
dispatch_async(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)
比必要时导入blocks.h并调用它:
- (void)loadInBackground {
performInBackground(^{
NSLog(@"Loading something in background");
//loading code
performOnMainQueue(^{
//completion hadler code on main queue
});
});
}
Run Code Online (Sandbox Code Playgroud)
如果适用于您,您还可以将块设置为简单属性:
@property (nonatomic, copy) void (^didFinishEditingHandler)(float rating, NSString *reviewString);
Run Code Online (Sandbox Code Playgroud)
确保块属性是"复制"!
当然你也可以使用typedef:
typedef void (^SimpleBlock)(id);
@property (nonatomic, copy) SimpleBlock someActionHandler;
Run Code Online (Sandbox Code Playgroud)
您还可以使用常用的c函数语法调用或调用块
-(void)iterateWidgets:(IteratorBlock)iteratorBlock{
iteratorBlock(someId, someInt);
}
Run Code Online (Sandbox Code Playgroud)
有关块的更多信息