2013-07-14 9 views
12

मैं 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) {} 
} 

तो क्या मैं यहाँ क्या करने की कोशिश कर रहा हूँ समारोह के लिए jsonArray वापस जाने के लिए है। स्पष्ट रूप से वापसी काम नहीं कर रहा है।

+9

आप यह नहीं कर सकते हैं। चूंकि आप एक एसिंक्रोनस कॉल से निपट रहे हैं, इसलिए आपकी 'कुछ फ़ंक्शन' विधि वापस आने के लिए एक मूल्य होने से पहले वापस आ जाएगी। – rmaddy

+2

मेरा सुझाव है कि आप एक कदम वापस लें और सोचें कि आपका कोड क्या करता है। आपको जल्द ही पता चलेगा कि आप जो चाहते हैं वह समझ में नहीं आता है। –

+1

आप कार्य करने के लिए ब्लॉक पास कर सकते हैं जो सफलता या त्रुटि पर निष्पादित होगा। – stosha

उत्तर

19

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

takeThisArrayAndShoveIt - विधि नाम पर lol –

3

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

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); 
     } 
} 

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

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

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

+(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); 
    }]; 
} 
संबंधित मुद्दे