2014-10-03 9 views
7

मुझे इस ब्लॉक के साथ समस्या है। मैं NSURLSession के ब्लॉक के अंदर डेटा प्राप्त करने की कोशिश कर रहा हूं।NSURLSession का उपयोग कर ब्लॉक से डेटा कैसे प्राप्त करें?

यहाँ मेरी कोड

-(NSDictionary *) RetrieveData{ 

    NSURLSession * session = [NSURLSession sharedSession]; 
    NSURL * url = [NSURL URLWithString: self.getURL]; 
    dataList =[[NSDictionary alloc] init]; 

    NSURLSessionDataTask * dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     self.json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

    }]; 
    return self.dataList; 
    [dataTask resume]; 

} 

यह NSURLSession के ब्लॉक के अंदर डेटा प्राप्त करना संभव है क्या है?

+2

क्या आप ब्लॉक के बाहर JSON का उपयोग करने का प्रयास कर रहे हैं? वह ब्लॉक असीमित रूप से चलता है, इसलिए आप जेएसओएन पार्सिंग करने वाले ब्लॉक से पहले [डेटाटास्क फिर से शुरू करें] '_well पहले_ रेखाओं को दबाएंगे। – Rob

+0

हाय @ रोब मैं अपनी पोस्ट अपडेट करता हूं। हां, मैं चाहता हूं कि जेसन ब्लॉक से डेटा प्राप्त करे और इसे मेरी विधि में वापस कर दें। – user3818576

+0

आप नहीं करते हैं। यदि आप इसे वापस पास करना चाहते हैं, तो आपको एक समापन ब्लॉक पैटर्न को नियोजित करना होगा। – Rob

उत्तर

23
-(void)getJsonResponse:(NSString *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure 
{ 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURL *url = [NSURL URLWithString:urlStr]; 

    // Asynchronously API is hit here 
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url 
              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    
               NSLog(@"%@",data); 
               if (error) 
                failure(error); 
               else {            
                NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
                NSLog(@"%@",json); 
                success(json);            
               } 
              }]; 
    [dataTask resume]; // Executed First 
} 

कॉल करें:

[self getJsonResponse:@"Enter your url here" success:^(NSDictionary *responseDict) { 
     NSLog(@"%@",responseDict); 
    } failure:^(NSError *error) { 
     // error handling here ... 
}]; 
+0

वाह! धन्यवाद! – user3818576

+0

शानदार उत्तर भाई.मैं उग्र हो गया। – user3182143

+0

खुशी है कि मैं –

1
NSURLSession *session = [NSURLSession sharedSession]; 
NSURL *url = [NSURL URLWithString:@"http://www.code-brew.com/projects/Instamigos/api/login.php?instagram_id=572275360&access_token=572275360.4c70214.57e0ecb1113948c2b962646416cc0a18&name=dpak_29&uuid=ios_1"]; 
// Asynchronously API is hit here 
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url 
             completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {  
              NSLog(@"%@",data); 
              // Executed when the response comes from server 

              // Handle Response here 
              NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
              NSLog(@"%@",json); 
}]; 
[dataTask resume]; // Executed First 
+0

मैंने पहले ही यह किया है लेकिन मैं इसे जेसन का डेटा वापस नहीं कर सकता। कृपया मेरी अद्यतन पोस्ट देखें। अगर मैंने इसका इस्तेमाल किया तो मेरे पास एक सफल आउटपुट है। – user3818576

+0

आप ब्लॉक के अंदर से वापस नहीं आ सकते हैं। यू को एक और दृष्टिकोण की जरूरत है। मैं आपको ब्लॉक –

+0

का उपयोग कर कोड प्रदान कर सकता हूं, मैंने देखा है कि एक और टिप्पणी –

8

आप एक पूरा होने के ब्लॉक का उपयोग करना चाहिए, जैसे:

- (void)retrieveData:(void (^)(NSDictionary * dictionary))completionHandler { 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURL *url = [NSURL URLWithString: self.getURL]; 

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

     if (completionHandler) { 
      completionHandler(dictionary); 
     } 
    }]; 
    [dataTask resume]; 
} 
फिर

प्रणाली को बुलाती है कि इस करना होगा:

[self retrieveData:^(NSDictionary *dictionary) { 
    // you can use the dictionary here 

    // if you want to update UI or model, dispatch this to the main queue: 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // do your UI stuff here 
    }); 
}]; 

// but dont try to use the dictionary here, because you will likely 
// hit this line before the above block fires off, and thus the 
// dictionary hasn't been returned yet! 

आप एक अतुल्यकालिक विधि है कि एक पूरा होने को रोजगार कॉल कर रहे हैं ब्लॉक पैटर्न, तो आपको अपने कोड में समापन ब्लॉक पैटर्न भी नियोजित करना चाहिए।

+0

बीटीडब्ल्यू, ध्यान दें कि ब्लॉक _local_ चर (जो इसे ब्लॉक में पैरामीटर के रूप में गुजरता है) का उपयोग करता है, उदाहरण आवृत्ति नहीं। इसके अलावा, स्टाइलिस्टिक रूप से, विधियां हमेशा लोअरकेस अक्षरों से शुरू होती हैं, इसलिए मैंने इसे बदल दिया। – Rob

+0

वाह! मैंने सोचा कि मुझे इसके लिए एक सरल कोड मिल गया है। मुझे आपके द्वारा पोस्ट की गई पोस्ट को पहले खोजने दें। क्षमा करें, मैं आपके कोड से परिचित नहीं हूं। – user3818576

+1

चिंता मत करो। पैटर्न के साथ खुद को परिचित करने में कुछ समय लगता है। लेकिन इसके चारों ओर अपनी बाहों को प्राप्त करना महत्वपूर्ण है क्योंकि आप इसे कोको एपीआई में जगह पर देखेंगे।जब भी आप "समापन" या "समापन हैंडलर" नामक पैरामीटर देखते हैं, तो इसका हमेशा अर्थ है कि इसे बाद में/असीमित रूप से कहा जाएगा और यदि आप इसे "पास करना" चाहते हैं, तो यह आम तौर पर आपके स्वयं के समापन ब्लॉक पैटर्न को लागू करने के लिए कहता है। – Rob

3

आप होगा इस विधि के चारों ओर अपने सिर प्राप्त करने के लिए। रीट्रीवडेटा (आप यहां कोको नामकरण सम्मेलनों का उल्लंघन कर रहे हैं) से रीट्रीविंगडेटा शुरू करने के लिए अपनी विधि का सबसे अच्छा नाम बदलें। आप वास्तव में डेटा को पुनर्प्राप्त करने वाली विधि नहीं लिख सकते हैं, क्योंकि इसमें सबसे खराब मामले में मिनट लग सकते हैं और आपके उपयोगकर्ता आपको नफरत करेंगे।

इसे कॉल करें रीट्रिविंगडेटा, इसे वापस लौटाएं, और दो ब्लॉक में पास करें, जब भविष्य में डेटा को पुनर्प्राप्त किया जाएगा, और भविष्य में जब एक त्रुटि हुई है और आप भविष्य में बुलाए जाएंगे डेटा नहीं मिल सकता

आप डेटा डेटा नहीं लौटा सकते हैं। पूछें "मैं डेटा कैसे वापस कर सकता हूं", आप बस नहीं कर सकते। आप कोड को एक ब्लॉक देते हैं जिसे डेटा उपलब्ध होने पर कहा जाता है, और जो को अवरोधित करता है, डेटा के साथ करने के लिए ज़िम्मेदार है जो आप इसके साथ करना चाहते हैं।

+0

वाह मदद कर सकता हूं! आपकी सलाह के लिए धन्यवाद। मैं वास्तव में इसकी प्रशंसा करता हूँ। मैं कोड से अलग कुछ नया सीखता हूं। – user3818576

संबंधित मुद्दे