首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为使用回调的类创建使用块的包装器?

如何为使用回调的类创建使用块的包装器?
EN

Stack Overflow用户
提问于 2012-12-09 11:11:27
回答 2查看 1.1K关注 0票数 4

我正在钻研iOS编程,并且正在学习如何使用块。我在我的项目中使用了一个糟糕的、过度工程化的库,它使用单一的回调方法来处理所有数据请求……

代码语言:javascript
复制
@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访问数据时使用块,但我不知道如何做到这一点。我想要这样的东西...

代码语言:javascript
复制
@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

...but我想不出如何将回调过程转换成块。不管怎么说,这里能给我一些方向吗?

提前感谢您的智慧!

顺便说一句,我只是在没有测试的情况下快速编写了代码,所以如果有任何拼写错误,我向您道歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-09 11:58:34

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

代码语言:javascript
复制
@property (nonatomic, copy) void (^errorHandler)(NSError *);
@property (nonatomic, copy) void (^successHandler)(NSString *);

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

代码语言:javascript
复制
- (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];
}

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

代码语言:javascript
复制
- (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;
}
票数 5
EN

Stack Overflow用户

发布于 2012-12-09 12:55:17

我们可以这样使用:

代码语言:javascript
复制
typedef void (^SuccessDataBlock)(NSMutableDictionary *);
@interface SuckyClassWrapper : NSObject <SuckyClassDelegate>
    @property (nonatomic, retain) NSData *inputData;
    @property (nonatomic, copy) SuccessDataBlock completionHandler;

    + (id)requestData:(NSData *)data successBlock:(SuccessDataBlock)handler;
@end

@implementation SuckyClassWrapper

@synthesize inputData;
@synthesize completionHandler;

- (id)initWithData:(NSData *)data completionHandler:(SuccessDataBlock)handler

{
    self = [super init];
    if (self != nil)
    {
        inputData = [data retain];
        self.completionHandler = handler;
    }
    return self;
}

+ (id)requestData:(NSData *)data successBlock:(SuccessDataBlock)handler
{
    return [[[self alloc] initWithData:data completionHandler:handler] autorelease];
}

//implement SuckyClass delegate
- (void)returnedSuckyData:(NSMutableDictionary *)data
{
    self.completionHandler(data);
}

@end

用法:

代码语言:javascript
复制
SuckyClassWrapper *wrapper = [SuckyClassWrapper requestData:data successBlock:^(NSMutableDictionary *successData) {
    //your code here
}];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13784267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档