【问题标题】:Custom completion block for my own method [duplicate]我自己的方法的自定义完成块[重复]
【发布时间】:2013-04-25 19:14:52
【问题描述】:

我刚刚发现了完成块:

 completion:^(BOOL finished){


                     }];

我需要做什么才能让我自己的方法执行完成块?

【问题讨论】:

标签: objective-c objective-c-blocks


【解决方案1】:

1) 定义自己的完成块,

typedef void(^myCompletion)(BOOL);

2) 创建一个将完成块作为参数的方法,

-(void) myMethod:(myCompletion) compblock{
    //do stuff
    compblock(YES);
}

3)这就是你使用它的方式,

[self myMethod:^(BOOL finished) {
    if(finished){
        NSLog(@"success");
    }
}];

【讨论】:

  • compclock(YES) 和 return compclock = YES 一样?
  • 是的,你明白了,我们可以根据需要输入 compclock(YES)/compclock(NO),我们可以在这里返回 NO 表示失败完成
  • 跟踪返回值:if(finished) NSLog(@"success");else NSLog(@"failure");
  • 如果您是 C/C++ 程序员,那么我发现使用指向函数语法的指针很容易记住块声明的语法。您唯一需要做的就是将 C/C++ 函数指针中的“*”替换为“^”......认为这可能对将来的某人有所帮助:)
  • 块中多个参数,用逗号分隔。例如。 completion:(void (^)(BOOL success, NSString* videoPath))
【解决方案2】:

您将块定义为自定义类型:

typedef void (^ButtonCompletionBlock)(int buttonIndex);

然后将其用作方法的参数:

+ (SomeButtonView*)buttonViewWithTitle:(NSString *)title 
                          cancelAction:(ButtonCompletionBlock)cancelBlock
                      completionAction:(ButtonCompletionBlock)completionBlock

当在代码中调用它时,它就像任何其他块一样:

[SomeButtonView buttonViewWithTitle:@"Title"
                       cancelAction:^(int buttonIndex) {
                             NSLog(@"User cancelled");
                   } 
                     completionAction:^(int buttonIndex) {
                             NSLog(@"User tapped index %i", buttonIndex);
                   }];

如果需要触发块,只需调用completionBlock()(其中completionBlock 是块的本地副本的名称)。

【讨论】:

    【解决方案3】:

    块变量在语法上类似于 C 中的函数指针。

    由于语法难看,它们通常是类型定义的,但是它们也可以正常声明。

    typedef void (^MyFunc)(BOOL finished);
    
    - (void)myMethod:(MyFunc)func
    {
    }
    

    查看非 typedef 的答案:

    Declare a block method parameter without using a typedef

    【讨论】:

    • 好的,谢谢,我会检查一下,这对我来说有点复杂,我在哪里有 typedef?
    • 你可以将typedef放在头文件中,在@interface之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2014-02-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多