NSURLSession在一个单独的类中无法将数据传递给ViewController

时间:2014-11-02 11:38:01

标签: ios objective-c xcode

我正在学习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更新也似乎没有完成。

我该如何完成这个过程?

我的做法完全错了吗?

感谢您的帮助。

1 个答案:

答案 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];
        });
    }];

}