我正在学习NSURLSession类,我想在项目中创建一个单独的类,其中包含我用来从Web服务检索数据的所有方法。
这是头文件tclass.h
#import <Foundation/Foundation.h>
@interface tclass : NSObject
- (void)returnIP;
@property (nonatomic, strong) NSString *IP ;
@end
这是实施文件tclass.m
#import "tclass.h"
@implementation tclass
- (id)init {
self = [super init];
return self;
}
- (void)returnIP {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:@"http://icanhazip.com/"]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
[self setIP:[NSString stringWithUTF8String:[data bytes]]];
}] resume];
}
@end
在我的ViewController类中,我首先使用returnIP
方法检索数据并将其存储在属性中,然后使用dispatch_async
更新UI,所有这些都使用- (IBAction)butact:(id)sender {
tclass *t = [[tclass alloc]init];
[_round setHidden:NO];
[_round startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[t returnIP];
dispatch_async(dispatch_get_main_queue(), ^{
[_round stopAnimating];
[_round setHidden:NO];
[_lab setText:[t IP]];
});
});
}
。
{{1}}
我的问题是没有填充IP属性,即使我正在使用主队列执行此操作,UI更新也似乎没有完成。
我该如何完成这个过程?
我的做法完全错了吗?
感谢您的帮助。
答案 0 :(得分:0)
感谢@Rob评论了我的帖子,我实现了一个基于块的解决方案。
这是更新的类标题
#import <Foundation/Foundation.h>
@interface tclass : NSObject
- (void)returnIP:(void (^)(NSString *ip))completionHandler;
@end
和实施
#import "tclass.h"
@implementation tclass
- (id)init {
self = [super init];
return self;
}
- (void)returnIP:(void (^)(NSString *ip))completionHandler {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:@"http://icanhazip.com/"]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
if(completionHandler) {
completionHandler([NSString stringWithUTF8String:[data bytes]]);
}
}] resume];
}
@end
用于调用此方法的机制有点改变:
- (IBAction)butact:(id)sender {
tclass *t = [[tclass alloc]init];
[_round setHidden:NO];
[_round startAnimating];
[t returnIP:^(NSString *ip) {
NSLog(@"%@", ip);
dispatch_async(dispatch_get_main_queue(), ^{
[_round stopAnimating];
[_round setHidden:YES];
[_lab setText:ip];
});
}];
}