iphone - 如何创建包装器以将 block 用于使用回调的类?

标签 iphone objective-c ios objective-c-blocks

我正在深入研究 iOS 编程,并且正在学习如何使用 block 。我在我的项目中使用了一个糟糕的、过度设计的库,它使用一个回调方法来处理所有数据请求...

@protocol SuckyClassDelegate <NSObject>
-(void)returnedSuckyData:(NSMutableDictionary*)data;
@end

@interface SuckyClass: NSObject
@property (nonatomic, weak) id<SuckyClassDelegate> delegate;
-(void)getSuckyData;
@end

@interface MyViewController: UIViewController <SuckyClassDelegate>
-(void)requestDataFromSuckyClass;
@end

我想为 SuckyClass 创建一个包装类,它允许我在需要从 SuckyClass 访问数据时使用 block ,但我不知道该怎么做。我想要这样的东西......

@interface SuckyClassWrapper
- (void)requestDataWithSuccessBlock:(void(^)((NSMutableDictionary*)data))successBlock;
@end

@implementation MyViewController
-(void)requestDataFromSuckyClass {
   SuckyClassWrapper *wrapper = [[SuckyClassWrapper alloc] init];
   [wrapper requestDataWithSuccessBlock:^(NSMutableDictionary *data) {
       NSLog(@"%@", data);
   }
}
@end

...但我不知道如何将回调过程转换为 block 。无论如何可以给我一些指导吗?

提前感谢您的智慧!

顺便说一下,我只是在没有测试的情况下编写代码,所以如果有任何错别字,我深表歉意。

最佳答案

诀窍是将完成 block 复制到一个类 iVar,您可以稍后调用它。

@property (nonatomic, copy) void (^errorHandler)(NSError *);
@property (nonatomic, copy) void (^successHandler)(NSString *);

下面是一个方法,它保存两个 block 供以后使用,然后调用另一个类方法:

- (void)methodWithErrorHandler:(void(^)(NSError *error))errorBlock successHandler: (void(^)(NSString *data))successBlock
{
    // Copy the blocks to use later
    self.successHandler = successBlock;
    self.errorHandler = errorBlock;

    // Run code
    [self doOtherThings];
}

稍后 - 当我们想要做的事情完成时,我们有另一个方法可以调用来运行 block 。在这个愚蠢的示例代码中,我们检查类属性 self.error 是否为 nil。如果它不是 nil,我们将该错误发送到我们保存的错误 block 。如果它是 nil,我们将 self.data 传递给成功 block 。

- (void)finishThingsUp
{
    // Check to see if we should call the error block or the success block
    if (self.error) {
        self.errorHandler(self.error);
    } else {
        self.successHandler(self.data);
    }
    // Clean up the blocks
    self.errorHandler = nil;
    self.successHandler = nil;
}

关于iphone - 如何创建包装器以将 block 用于使用回调的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13784267/

相关文章:

ios - 如何设置 iOS 应用程序使用 USB 音频输入和输出到内部扬声器

iphone - iOS 6 中的 MapKit - 如何查找附近的地点...?

iphone - Google Analytics Mobile(ipod/iphone)自定义变量跟踪

iOS 后台执行函数

iphone - 如何在系统级别捕获和记录 iOS 触摸事件?

iphone - 简单的日期格式问题yyyymmdd

ios - UINavigationController 推送因无法识别的选择器 barStyle 而崩溃

ios - 在 setRegion 上取消选择 MKAnnotationView

ios - 抓取特定 ABPerson 的图像时崩溃

TableView 中的 iOS 计时器