objective-c - 从委托(delegate)方法调用完成 block

标签 objective-c delegates objective-c-blocks

这很难解释,但基本上我想做的是从委托(delegate)方法调用基于 block 的方法中的完成处理程序。

我有调用上传函数的方法。

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

在 UpLoad 管理器内部,该方法执行所有必要的操作来上传文件。

有一个委托(delegate)方法,我想从中调用成功 block 。

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

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

我在深夜写了这篇文章,所以如果它没有意义,请告诉我。

谢谢

最佳答案

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

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

在上传文件中赋值:

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

然后随时调用它:

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

请记住,如果您不再需要该 block (您可能不需要,因为下载已完成),最好清除您的 block 副本。这样,如果调用者在 block 中引用下载管理器,您将打破他的保留周期( block 将保留保留 block 的下载管理器)。

关于objective-c - 从委托(delegate)方法调用完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652785/

相关文章:

iphone - 如何在每个切片的饼图中显示文本

ios - 将图像缩放到给定的NSData字节大小-PNG压缩

iphone - Objective C 代码可以在 iPad 上运行,但不能在 iPhone 上运行

c# - EndInvoke() 是可选的、某种可选的还是绝对不是可选的?

ios - 如何同步打开/创建UIManagedDocument?

objective-c - 对于 Objective-C,实现值对数组的最有效方法是什么?

.net - 如何在 Visual Studio 中自动完成委托(delegate)

c# - 如何在 C# 中实现线程安全的无错误事件处理程序?

c - 获取协议(protocol)中方法 block 的 NSMethodSignature

iphone - self 保留在这个 Objective-C block 中吗?