假设我有一个简单的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
请记住,这仅是如何使用块的示例-将原始的
NSData
和NSURLSession
对象返回到视图控制器是不好的做法,您应该编写API层来转换您的值以使其对您友好视图控制器。关于ios - iOS-从另一个类的completionHandler块访问与 View 相关的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37132224/