替换块内的块

时间:2017-07-27 12:57:42

标签: objective-c cocoa block

我创建了一个定义如下的类:

标题

typedef void (^myBlock)(NSString *value);

- (instancetype)initWithIdentifier:(NSString *)identifier
                    runOnSelection:(myBlock)runOnSelection;

当我创建这种对象时,我会这样做:

MyObject *object = [[MyObject alloc] initWithIdentifier:@"my id"
         runOnSelection:^(NSString *value){
                                doThis();
                                doStuff();
                               doSomethingElse();
        }];

问题在于我有很多对象按顺序被初始化,所有这些都做同样的事情。

我正在考虑为doThisdoStuffdoSomethingElse创建一个块,如下所示:

void (^doALot)(NSString *value) = ^void(NSString *value) {
                doThis();
                doStuff();
                doSomethingElse();
};

并用

之类的内容替换初始化
MyObject *object = [[MyObject alloc] initWithIdentifier:@"my id"
         runOnSelection:doALot()];

但问题是doALot需要一个参数。如何将块附加到类似的东西上?

我知道我能做到

MyObject *object = [[MyObject alloc] initWithIdentifier:@"my id"
         runOnSelection:^(NSString *value){
                  doALot(value)
       }];

但是我想知道我是否可以通过简单地将两者连接起来而不必将其放入块内。如果我没有错,我看到Apple在拥有处理程序的API时这样做,你可以在外部或内部定义处理程序,所以我怀疑这是可能的。

如何?

1 个答案:

答案 0 :(得分:1)

创建新的块对象,如下所示 -

typedef void (^myBlock)(NSString *value);

myBlock block=^(NSString *value){
    doThis();
    doStuff();
    doSomethingElse();
};

并用

之类的内容替换初始化
MyObject *object = [[MyObject alloc] initWithIdentifier:@"my id"
         runOnSelection:block];

希望它有所帮助!