假设我有一个简单的UIView类(称为“ ViewController”),可以访问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相关的对象)?
我在块概念上很新。解决此问题的最佳方法是什么?

最好的祝福。

最佳答案

有多种方法可以执行此操作,但是您可以执行以下操作:在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];
}


这将允许您使用完成处理程序来调用postData方法,因此您可以使用视图控制器上返回的数据。这是您的呼叫在视图控制器中的外观:

@implementation ViewController

- (void)viewDidLoad {
    api = [[API alloc] init];
    [api postDataWithCompletion:^(NSData *, NSURLResponse *, NSError *) {
        // update your view controller here with the right data
    }];
}

@end


请记住,这仅是如何使用块的示例-将原始的NSDataNSURLSession对象返回到视图控制器是不好的做法,您应该编写API层来转换您的值以使其对您友好视图控制器。

关于ios - iOS-从另一个类的completionHandler块访问与 View 相关的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37132224/

10-14 21:14
查看更多