ios - 如何使方法具有可执行 block 作为参数,该参数应在 objective-c 中的方法完成时执行

标签 ios objective-c methods objective-c-blocks

我想定义一个方法,该方法将包含该 block 作为参数,但 block 应该在该方法的完成时运行。

例如:

[picker dismissViewControllerAnimated:YES completion:^{

        imageThumb = pickedImage;
        imageViewThumb.image = imageThumb;


}];

请看看我做了什么。

我在 .h 文件中声明了该方法 -

-(void)resizeImageForSmoothness: (int) imageSmoothness completion: (void (^)(void))completion;

我在.m文件中实现了它-

-(void)resizeImageForSmoothness:(int)imageSmoothness completion: (void (^)(void))completion
{

// Here i performed my image resizing activity  

}

我的代码如何知道该方法已完成,然后运行完成 block ?

我们如何声明和定义这样的方法?

最佳答案

如何存储 block 取决于你如何做你的事情。如果它是同步操作(即该方法会阻塞,直到整个操作完成),您只需像函数一样调用它:

- (void)fooWithHandler:(void(^)())handler
{
    // Do things.
    handler();
}

如果操作是异步的,您可能希望将 block 存储在变量甚至字典中。在这种情况下,您需要复制该 block 。您可以通过低级 Block_copyBlock_release C 函数来完成此操作,但您也可以将 block 视为 Objective-C 对象! (出于某种原因,Xcode 不提供自动完成功能。)

@interface MyClass {
    void (^myHandler)();
}
- (void)fooWithHandler:(void(^)())handler
@end

@implementation MyClass
- (void)fooWithHandler:(void(^)())handler
{
    myHandler = [handler copy];
    // Do things.
    // Then, when you're done (this is probably in another method):
    if (myHandler) {
        myHandler();
        myHandler = nil;
    }
}
@end

关于ios - 如何使方法具有可执行 block 作为参数,该参数应在 objective-c 中的方法完成时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952027/

相关文章:

android - 带有搜索过滤器的Flutter应用 GridView ?

objective-c - UIScrollView setZoomScale 不起作用?

objective-c - 在 Objective-C 中使用内联汇编对变量进行 ROL/ROR

java - 将数组传递给另一个方法并复制它

java - 如何避免在 Java 中使用方法选择器参数(标志/boolean 参数)

iphone - 后退按钮关闭 ios 中的应用程序

ios - Realm 对象字段有时为零

ios - 如何在 Swift3 中更改 UITextView 中文本字符串的颜色

objective-c - 在 OCMock 中使用 block 期望

ruby-on-rails - 如何在rails应用程序中覆盖gem的类方法?