2012-06-15 29 views
12

साथ enqueueBatchOfHTTPRequestOperations मुद्दा मैं एक बार में एक से अधिक अनुरोध शुरू करने के लिए इस विधि का उपयोग AFNetworking:AFNetworking: पूरा होने के ब्लॉक

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
           progressBlock:(void (^)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations))progressBlock 
          completionBlock:(void (^)(NSArray *operations))completionBlock 

उनमें से एक एक AFJSONRequestOperation है। समस्या यह है कि बैच के समापन-ब्लॉक के बाद इस JSON ऑपरेशन का सफलता-ब्लॉक निष्पादित किया जाता है। कारण यह है: AFJSONRequestOperation में JSON प्रसंस्करण के लिए एक आंतरिक प्रेषण कतार है। इसलिए पूर्णांक ब्लॉक को कॉल करते समय JSON डेटा अभी भी प्रसंस्करण में है।

प्रश्न: के बाद पूर्णांक ब्लॉक में कोड निष्पादित कैसे किया जा सकता है JSON ऑपरेशन के सफलता ब्लॉक को बुलाया गया है?

मैं मुख्य कतार पर एक कोड ब्लॉक प्रेषण करने के लिए करने की कोशिश की, लेकिन वह मदद नहीं की।

उत्तर

1

तो यह संभव है, सबसे आसान समाधान सिर्फ पूरे बैच के पूरा होने के ब्लॉक करने के लिए प्रत्येक ऑपरेशन की सफलता ब्लॉक से अपने प्रसंस्करण कोड स्थानांतरित करने के लिए हो सकता है।

for(AFHTTPRequestOperation *operation in operations){ 
    if(operation.response.statusCode == 200){ 
     //Do something with the response 
    }else{ 
    //Handle the failure 
    } 
} 

अगर आपको पहिले से करने की जरूरत है operation.request.URL संपत्ति के माध्यम से उपलब्ध प्रत्येक ऑपरेशन के लिए यूआरएल पता है:

आप NSArray *operations पूरा होने के ब्लॉक में उपलब्ध है, आप आपरेशनों के माध्यम से पुनरावृति और देख सकते हैं के लिए है विभिन्न कार्यों

+0

ओपी कहा json अभी भी असंसाधित जब पूरा होने के कहा जाता है, तो यह कार्य नहीं करेगा, है ना? – kevboh

+0

हाँ, यही कारण है कि मैं पूछ रहा हूँ। तो यह जवाब मेरी मदद नहीं कर रहा है। – Felix

+1

ओह ठीक है मैं गलत पढ़ता हूं। आपकी समस्या के लिए, यदि आप इसके लिए इंतजार कर सकते हैं तो जल्द ही एक पैच हो सकता है। https://github.com/AFNetworking/AFNetworking/issues/362 –

0

आप कतार की शुरुआत करने के लिए अपने Json आपरेशन स्थानांतरित कर सकते हैं, और फिर एक निर्भरता जोड़ सकते हैं ताकि एक और ऑपरेशन केवल json ऑपरेशन के बाद शुरू कर सकते हैं खत्म:

[lastOperation addDependency:jsonOperation] 
+0

क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

मुझे ऐसा कुछ लगता है: अगर (पिछला ऑपरेशन) {[ऑपरेशन एडडपेन्सीेंसी: पिछले ऑपरेशन]; } पिछले ऑपरेशन = ऑपरेशन; [संचालन addObject: ऑपरेशन]; यह मेरे लिए काम नहीं करता – Sosily

0

ऐसा प्रतीत होता है कि वहाँ कोई आसान तरीका वास्तव में क्या ओ पी अनुरोध है, तो यहाँ कुछ आसान कामकाज से जुड़े हैं करना है।

एक बदमाश रणनीति के बजाय AFHTTPRequestOperation का उपयोग करना होगा और फिर NSJSONSerialization का उपयोग करके प्रतिक्रिया को परिवर्तित करना होगा।

तो ऑपरेशन की सफलता ब्लॉक लगेगा जैसे

success:^(AFHTTPRequestOperation *operation, id responseObject){ 
       NSError *error ; 
       id json = [NSJSONSerialization JSONObjectWithData:responseObject 
              options:kNilOptions error:&error] ; 
       ... 
      } 

चेतावनियां लागू होगा - बड़े JSON प्रतिक्रियाओं इस संभावित कोड ब्लॉक कर रहा है के लिए, और NSJSONSerialization मुद्दों के लिए AFNetworking समाधानों में से कुछ लागू नहीं होगा। लेकिन यह आपको जा रहा है।

अद्यतन: पहले टिप्पणीकार नीचे AFJSONRequestOperation का उपयोग कर और बैच पूरा होने के ब्लॉक में इस पर responseJSON बुला पता चलता है। यदि आपकी स्थिति इसकी अनुमति देती है तो मैं इसके साथ अच्छा हूं। मेरे वर्तमान उपयोग मामले में यह मेरे कोड को कुछ हद तक जटिल करता है (मैं JSON कॉल के मिश्रित सेट का उपयोग कर रहा हूं, इसलिए कोड क्लीनर है अगर मैं इसे success सीधे ऑपरेशन से जुड़े ब्लॉक में रख सकता हूं)।

+0

यह जेएसओएन ऑपरेशन का उपयोग करने के लिए और अधिक समझदारी करेगा, और बैच समापन ब्लॉक में बस 'प्रतिक्रिया जेएसओएन' पर कॉल करें। यह विधि तुल्यकालिक रूप से लौटती है। यह आपके द्वारा उल्लेख की गई चेतावनियों के बिना ओपी चाहता है व्यवहार प्रदान करता है। –

+0

धन्यवाद @Aaron। मैंने अपना जवाब अपडेट किया। – brainjam