iOS - 从另一个类的completionHandler块访问与视图相关的类

时间:2016-05-10 07:44:22

标签: ios objective-c

假设我有一个名为'ViewController'的简单UIView类,它可以访问POST请求的'API'类。

@implementation ViewController
- (void)viewDidLoad {
    api = [[API alloc] init];
    [api postData];
}
@end

API类将打开NSURLSession并发布数据

@implementation API
- (void)postData {
    [[session dataTaskWithRequest:rq completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        // show Alert in ViewController if response code is 200

    }] resume];
}
@end

如何在API类的completionHandler中显示简单警报(或修改任何UIView相关对象)? 我是块概念的新手。解决这个问题的最佳方法是什么?

最好的问候。

1 个答案:

答案 0 :(得分:1)

有多种方法可以执行此操作,但您可以执行以下操作:向postData方法添加完成块。这是一个例子:

- (void)postDataWithCompletion:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionBlock {
    [[session dataTaskWithRequest:rq completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (completionBlock()) {
                completionBlock(data, response, error);
            }
        });
    }] resume];
}

这将允许您使用完成处理程序调用{​​{1}}方法,以便您可以使用视图控制器上返回的数据。以下是您的视图控制器中的调用方式:

postData

请记住,这只是一个如何使用块的示例 - 将原始@implementation ViewController - (void)viewDidLoad { api = [[API alloc] init]; [api postDataWithCompletion:^(NSData *, NSURLResponse *, NSError *) { // update your view controller here with the right data }]; } @end NSData对象返回到视图控制器是不好的做法,您应该编写一个API层来进行转换您的价值观与您的视图控制器友好。