दिलचस्प पोस्ट
एसक्यूएल सर्वर डेराटाइम के लिए वर्चार कन्वर्ट वेबब्राउजर नियंत्रण में एक कुकी सेट करना एक MySQL डाटाबेस में एक टेबल का बैकअप कैसे लें? विशेषाधिकारों को ऊपर उठाने का उपयोग UseShellExecute = false के साथ काम नहीं करता है मैं WCF REST पद्धति से कस्टम HTTP स्थिति कोड कैसे वापस कर सकता हूं? रिमोट रिपॉज़िटरी में परिवर्तनों को धक्का करते समय यह Git चेतावनी संदेश क्या है? NHibernate बनाम LINQ से SQL फायरबेज – क्या एक साझा रहस्य है auth.uid? डायरेक्ट्री इंडेक्स को ऑर्डर डायरेक्टिव द्वारा मनाई गई Java में रंग (आर, जी, बी, ए) को get.rgb (x, y) पूर्णांक पिक्सल कन्वर्ट करने के लिए कैसे करें? JQuery में, मैं एक तत्व को इसके नाम विशेषता से कैसे चुनूं? एक्लिप्स लॉन्च करते समय "एप्लिकेशन सर्विस प्राप्त करने में असमर्थ" त्रुटि क्या यह थ्रॉएबल को पकड़ने के लिए एक बुरा अभ्यास है? एक WPF डेटा ग्रिड पाठ कॉलम में बाइंडिंग हैशोड में प्रधान संख्या का उपयोग क्यों करना है?

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

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

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

Solutions Collecting From Web of "किसी ब्लॉक के अंदर फ़ंक्शन के लिए मूल्य लौटें"

आप अपनी विधि के लिए रिटर्न मान बनाने के लिए पूरा ब्लॉक का उपयोग नहीं कर सकते। 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); }]; }