2016-08-01 36 views
0
得到的NSDictionary
-(NSDictionary *)fetchFromUrl:(NSString *)url{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
             completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            dataFetched = [NSJSONSerialization JSONObjectWithData:data 
                          options:0 
                          error:NULL]; 

           }]; 
    [task resume]; 
    NSLog(@"dataFetched, %@", dataFetched); 

    return dataFetched; 
} 

所以我试图把dataFetched作为一个全局变量,所以我可以访问它在我的.m文件,并使其对其他.m文件访问,但是当我试图NSLog的dataFetched从其他.m文件输出(null)。无论如何,我可以通过其他需要数据的.m文件访问数据吗?如何从NSURLSessionDataTask

回答

1

您需要在您的方法中使用block,而不是返回NSDictionary,因此请更改您的代码。

首先改变你的方法是这样

-(void)fetchFromUrl:(NSString *)url withDictionary:(void (^)(NSDictionary* data))dictionary{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler: 
            ^(NSData *data, NSURLResponse *response, NSError *error) { 
             NSDictionary *dicData = [NSJSONSerialization JSONObjectWithData:data 
                        options:0 
                         error:NULL]; 
             dictionary(dicData); 
            }]; 
    [task resume];   
} 

现在打电话给你的方法是这样

[self fetchFromUrl:urlStr withDictionary:^(NSDictionary *data) { 
    self.dataFetched = data; 
    NSLog(@"data %@",data); 
}]; 
+0

它的工作!但这(void(^)(NSDictionary * data))字典是如何工作的? – jane

+0

您正在进行一个API调用,并且在后台工作(异步),并且您使用return'NSDictionary'声明的函数以同步方式工作,这就是为什么当您在此之前得到响应时,它将返回空字典,块在异步方式工作。 –

+0

好吧,它的工作,但我将如何访问数据值?我试过使用__block,但它仍然没有得到值。 – jane

0

如果修改NSDictionary你需要声明__block属性为你的财产像块内下方

@property (nonatomic, strong) __block NSDictionary *dataFetched; 

doc

使用__block变量共享存储如果你需要能够以 从一个块内改变捕获变量的值,可以使用 对原始变量 decl使用__block存储类型修饰符aration。这意味着变量存在于原始变量的词法范围和在该范围内声明的任何 块之间共享的存储中,即 。

+0

好了,所以为什么我需要添加__block? – jane

+0

对不起,我添加了__block,但仍然空... – jane

相关问题