从委托方法调用完成块

Ant*_*lli 4 delegates objective-c objective-c-blocks

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

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

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

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

有一个委托方法,我想从中调用成功块.

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

成功在uploadFile方法中定义.我怎么去调用这个完成处理程序?

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

谢谢

dan*_*anh 12

声明一个属性是块的副本:

@property(nonatomic, copy) void (^completionBlock)(NSDictionary *);
Run Code Online (Sandbox Code Playgroud)

在uploadFile中分配它:

- (void)uploadFile:(NSString *)url success:(void (^)(NSDictionary *))completionBlock {
    self.completionBlock = completionBlock;
    // ...
Run Code Online (Sandbox Code Playgroud)

然后随时调用它:

if (self.completionBlock) self.completionBlock(someDictionary);
self.completionBlock = nil;  // see below
Run Code Online (Sandbox Code Playgroud)

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