दिलचस्प पोस्ट
स्थिर कारखाने के तरीके क्या हैं? ज़िप कोड के बीच दूरी की गणना करें … और उपयोगकर्ता AngularJS का उपयोग करते हुए नई विंडो में लिंक खोलें सिद्धांत में डिफ़ॉल्ट मान PHP पीडीओ: अक्षरसेट, सेट नाम? मैं वेरिएबल्स स्टोर करने के लिए कोने में $ रूट स्कोप का उपयोग कैसे करूं? JS / jQuery का उपयोग करके टचस्टार्ट समर्थन के लिए ब्राउज़र की जांच कैसे करें? सर्वलेट एप्लिकेशन में अपलोड की गई फ़ाइलों को सहेजने का अनुशंसित तरीका 7 x 7 के माध्यम से "एडीबी डिवाइस" के माध्यम से USB पर दिखाई देने वाले नेक्सस 7 नहीं कैसे बास में एक आदेश से आउटपुट में एक चर सेट करने के लिए? जब परिवर्तन किए गए हैं, तो "क्या आप इस पृष्ठ से दूर नेविगेट करना चाहते हैं?" को कैसे दिखाया जाए? 'Pthread_create' के लिए अपरिभाषित संदर्भ – लिंकर कमांड विकल्प ऑर्डर (ऑब्जेक्ट फ़ाइलों के पहले / बाद में पुस्तकालय)? Angular.JS: समान नियंत्रक साझा करने वाले दृश्य, दृश्य बदलते समय मॉडल डेटा रीसेट करता है वेबसॉट्स हाइबी 08+ में डेटा फ़्रेम का निर्माण कैसे करें? मेरे AJAX आवेदन में वापस बटन पर कॉल को रोकना: मैं यह कुछ नहीं करना चाहता हूँ!

किसी ब्लॉक के अंदर फ़ंक्शन के लिए मूल्य लौटें

मैं एक सर्वर से डेटा प्राप्त करने के लिए AFNetworking का उपयोग कर रहा हूं:

-(NSArray)some function { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSArray *jsonArray =[JSON valueForKey:@"posts"]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} } 

तो मैं यहाँ क्या करने की कोशिश कर रहा हूं फ़ंक्शन में जेसनअरेरे को वापस करना है। जाहिर है वापस लौटना काम नहीं कर रहा है

वेब के समाधान से एकत्रित समाधान "किसी ब्लॉक के अंदर फ़ंक्शन के लिए मूल्य लौटें"

आप अपनी विधि के लिए रिटर्न मान बनाने के लिए पूरा ब्लॉक का उपयोग नहीं कर सकते। AFJSONRequestOperation इसके काम अतुल्यकालिक रूप से करता है ऑपरेशन अभी भी काम कर रहा है, जबकि someFunction वापस जा रहा है। सफलता और असफलता ब्लाकों हैं कि आप किस तरह के मूल्यों को प्राप्त कर सकते हैं जहां उन्हें जाना चाहिए।

यहां एक विकल्प कॉलर में आपके रैपर विधि के लिए एक तर्क के रूप में पारित करना है ताकि पूरा ब्लॉक सरणी बंद कर सके।

 - (void)goFetch:(id)caller { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { [caller takeThisArrayAndShoveIt:[JSON valueForKey:@"posts"]]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} } 

आप अपने कॉलर को सफलतापूर्वक चलाने के लिए एक ब्लॉक बनाने और पास कर सकते हैं। फिर goFetch: अब कॉलर पर मौजूद गुणों को पता करने की आवश्यकता नहीं है।

 - (void)goFetch:(void(^)(NSArray *))completion { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { if( completion ) completion([JSON valueForKey:@"posts"]); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} } 

जैसा कि दूसरों ने कहा है, आप ऐसा नहीं कर सकते जब एसिंक कॉल से निपटते हैं अपेक्षित अर्रे लौटने के बजाय, आप एक पूर्णता ब्लॉक को एक पैरामीटर के रूप में पास कर सकते हैं

 typedef void (^Completion)(NSArray* array, NSError *error); -(void)someFunctionWithBlock:(Completion)block { AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSArray *jsonArray =[JSON valueForKey:@"posts"]; if (block) block(jsonArray, nil); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { if (block) block(nil, error); } } 

फिर जहां आप कुछ फंक्शन फोन करते हैं यह कोड आपके लिए उचित त्रुटि संभाल भी करेगा।

 [yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) { if (error) { NSLog(%@"Oops error: %@",error.localizedDescription); } else { //do what you want with the returned array here. } }]; 

मुझे इस तरह की समस्या का सामना करना पड़ा और नीचे इस विधि द्वारा इसे हल करना मैंने ब्लॉकों का उपयोग करते हुए ऊपर जवाब देखा लेकिन उस समय के लिए यह समाधान अधिक उपयुक्त था। विधि का तर्क सरल है आपको ऑब्जेक्ट और उसकी विधि को पैरामीटर के रूप में भेजने की आवश्यकता है और अनुरोध समाप्त होने के बाद यह विधि कहा जाएगा। आशा करता हूँ की ये काम करेगा।

 +(void)request:(NSString *)link parameters:(NSDictionary *)params forInstance:(id)instance returns:(SEL)returnValue { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:link parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { [instance performSelector:returnValue withObject: responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [instance performSelector:returnValue withObject:nil]; //NSLog(@"Error: %@", error); }]; }