从委托方法调用完成块

时间:2014-03-26 06:07:49

标签: objective-c delegates objective-c-blocks

很难解释,但基本上我要做的是从委托方法中调用基于块的方法中的完成处理程序。

我有调用上传功能的方法。

[[UploadManager sharedManager] uploadFile:@"/Path/To/Image.png" success:^(NSDictionary *response) {
    NSLog(@"Uploaded");
}];

在UpLoad管理器内部,该方法执行上载文件所需的所有操作。

我想从中调用成功块的委托方法。

- (void)fileDidUploadAndReceiveData:(NSData *)data {
    NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError];
    // Call the completion method
    success(response);
}

成功在uploadFile方法中定义。我该如何调用这个完成处理程序?

我是在深夜写的,所以如果它没有意义,请告诉我。

谢谢

5 个答案:

答案 0 :(得分:12)

声明一个属性块的副本:

@property(nonatomic, copy) void (^completionBlock)(NSDictionary *);

在uploadFile中分配:

- (void)uploadFile:(NSString *)url success:(void (^)(NSDictionary *))completionBlock {
    self.completionBlock = completionBlock;
    // ...

然后随时调用它:

if (self.completionBlock) self.completionBlock(someDictionary);
self.completionBlock = nil;  // see below

请记住,如果您不再需要该块(自下载完成后您可能没有),那么将块的副本弄清楚是一个好习惯。这样,如果调用者引用块中的下载管理器,您将打破他的保留周期(该块将保留保留该块的下载管理器)。

答案 1 :(得分:0)

UploadManager类中为成功块创建一个实例变量。在uploadFile:success:方法中设置此ivar。然后使用此ivar在fileDidUploadAndReceiveData:方法中调用块。

答案 2 :(得分:0)

在UploadManager中添加属性@property (nonatomic, copy) void (^tempSuccess)(NSDictionary * response);

在uploadFile方法中

分配

self.tempSuccess = success;

最后

- (void)fileDidUploadAndReceiveData:(NSData *)data {
    NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError];
    // Call the completion method
    self.tempSuccess(response);
}

希望它有所帮助!

答案 3 :(得分:0)

除了我上面的评论,这是我通常处理块操作的方式

在您的UploadManager.h文件中

定义一个类型

//// .h文件

typedef void (^ActionNameBlock)(id responseObject);


- (void)setAction:(ActionNameBlock)actionBlock;
在您的UploadManager.m文件中

//// .m文件

@property (nonatomic, copy) ActionNameBlock action;

- setAction:(ActionNameBlock)_action
{
self.action = _action;
}


// now in your block operation code 

[[UploadManager sharedManager] uploadFile:@"/Path/To/Image.png" success:^(NSDictionary *response)
 {
    NSLog(@"Uploaded");
if (self.action) { self.action(response); }
}];

答案 4 :(得分:0)

fileDidUploadAndReceiveData中定义了UploadManager

如果是,那么您可以只存储成功块的副本,并按照您编写它的方式调用它。

在您的UploadManager标题内添加一个副本块属性:

typedef void (^OnUploadFileSuccesBlock)(NSDictionary *response);

@interface UploadManager : NSObject

@property (nonatomic, copy) OnUploadFileSuccesBlock uploadFileSucces;

在uploadFile方法中保留成功块的副本:

- (void) uploadFile:(NSString*)path success:(OnUploadFileSuccesBlock)block {
  self.uploadFileSucces = block
  ...
}

在你的委托方法中你可以称之为:

- (void)fileDidUploadAndReceiveData:(NSData *)data {
    NSDictionary *response = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError];
    // Call the completion method
    self.uploadFileSucces(response);
}