दिलचस्प पोस्ट
AngularJS। नियंत्रक घटक के बाहर से नियंत्रक फ़ंक्शन को कैसे कॉल करें NSMutableArray addObject गिनती को प्रभावित नहीं कर रहा है? जावास्क्रिप्ट चेतावनी बॉक्स शीर्षक को कैसे संपादित करें? एक स्ट्रिंग के भीतर URL खोजने के लिए नियमित अभिव्यक्ति दो तारीखों के बीच तिथियों का चयन करने के लिए SQL क्वेरी एसोसिएशन टेबल में अतिरिक्त फ़ील्ड के साथ पहले, बहुत से कई कोड बनाएं jQuery दस्तावेज़.ready बनाम स्वयं कॉल अनाम समारोह स्रोत कोड में एथ के लिए उपयोग किए जाने वाले पासवर्ड को संभालना phs तारीख को mysql प्रारूप में कनवर्ट करें कोई संसाधन नहीं मिला – थीम। ऐप कॉमपेट। हल्का। डार्क ऍक्शन बैंक पृष्ठ पर किसी विशिष्ट तत्व को कैसे जाना है? मेरे AJAX आवेदन में वापस बटन पर कॉल को रोकना: मैं यह कुछ नहीं करना चाहता हूँ! Std :: vector <char> में एक फ़ाइल को पढ़ने का कुशल तरीका? TINYTEXT, टेक्स्ट, MEDIUMTEXT और LONGTEXT अधिकतम संग्रहण आकार ओरेकल पर AUTO_INCREMENT के साथ आईडी कैसे बनाऊँ?

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

मैं एक सर्वर से डेटा प्राप्त करने के लिए 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); }]; }