2016-08-01 35 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

相關問題