2012-07-05 15 views
9

मुझे ब्लॉक से नफरत है। वे कोड को संक्षिप्त बनाने के लिए हैं, लेकिन मुझे कुछ और बदसूरत नहीं मिला। उदाहरण के लिए, AFNetworking साथ:क्या ब्लॉक के रूप में विधियों को पारित करने का कोई तरीका है?

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 
        failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) { 
    // Failure code 
}] 

कुछ इस तरह काफी बेहतर हो गया होता:

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:@selector(requestSuccess:response:json:) 
        failure:@selector(requestSuccess:response:error:)] 

इसलिए, यह ब्लॉक के रूप विधि के चयनकर्ताओं का उपयोग करने के लिए संभव है? यदि नहीं, तो मैं ब्लॉक कोड को बेहतर कैसे बना सकता हूं?

यह मुझे परेशान करता है, क्योंकि ये ब्लॉक उद्देश्य-सी प्रोग्रामिंग का भविष्य प्रतीत होते हैं और वे केवल पठनीय नहीं हैं।

+3

पहले ब्लॉक 'बदसूरत' लग सकते हैं लेकिन वे शक्तिशाली हैं और विशिष्ट कारण हैं कि वे 'भविष्य होने लगते हैं'। मैं आपको अच्छी जानकारी रखने के लिए इस आलेख की अनुशंसा करता हूं: http://ios-blog.co.uk/articles/tutorials/programming-with-blocks-an-overview/ – Alladinian

+1

ब्लॉक कोड को अधिक संक्षिप्त नहीं बनाते हैं, वे करते हैं कोड अधिक शक्तिशाली। – dreamlax

+0

यह एक वैध सवाल है, मुझे लगता है। चूंकि ब्लॉक दोनों पैरामीटर (0..एन) प्राप्त कर सकते हैं और पैरामीटर या शून्य को वापस कर सकते हैं, विधियों को ब्लॉक के रूप में उपयोग करने में सक्षम होना चाहिए ... या इसे किसी अन्य तरीके से रखने के लिए, कक्षा स्तर पर ब्लॉक को परिभाषित करना अच्छा होगा। मुझे नहीं लगता कि आप कर सकते हैं ... –

उत्तर

6

तो आपको लगता है ब्लॉक निर्माण कोड को पढ़ने के लिए कठिन बना देता है? मुझे लगता है कि वे कभी-कभी चीजों को समझने में आसान बना सकते हैं, खासकर नेटवर्किंग कोड जैसे असीमित संदर्भों में।

इसे पढ़ने में आसान बनाने के लिए आप चर को ब्लॉक असाइन कर सकते हैं। (वास्तव में ब्लॉक उद्देश्य-सी वस्तुएं हैं।)

उदाहरण:

typedef void(^SuccessBlock)(NSURLRequest *request, NSURLResponse *response, id JSON); 

SuccessBlock successBlock = ^(NSURLRequest *request, NSURLResponse *response, id JSON) { 
    // code block 
}; 

AFJSONRequestOperation* operation; 
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                  success:successBlock 
                  failure:nil]; 

तुम भी यह छोटे रखने के लिए ब्लॉक के अंदर एक भी हैंडलर विधि कॉल कर सकते हैं।

+0

यह कई "शैली" मुद्दों को हल करता है, मुझे लगता है कि यह जाने का सबसे अच्छा तरीका है। धन्यवाद ! –

1

आप ब्लॉक को छील सकते हैं ताकि वे विधि कॉल में इन-लाइन पैरामीटर न हों। यह अभी भी ब्लॉक कुरूपता का एक सा शामिल है, लेकिन अभी भी कुछ पठनीयता में सुधार:

void (^successBlock)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON); 

successBlock =^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
}; 
//do same for failure block as "failureBlock" 
... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
      requestsuccess:successBlock 
        failure:failureBlock]; 
1

लघु ब्लॉक अच्छे हैं, बहुत ज्यादा लंबे समय तक लोगों को, नहीं जहां रेखा खींचना एक निजी प्राथमिकता निश्चित रूप से है ...

एक ब्लॉक के लिए एक विधि का उपयोग करना कठिन नहीं है (दूसरी तरह के चारों ओर एक के और अधिक है चुनौती)। सरल दृष्टिकोण आप एक विधि का उपयोग करना चाहते हैं तो:

- (void) requestSuccess:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        json:(id)JSON 
{ 
    // Some 
    // very 
    // long 
    // (and as ugly as blocks) 
    // processing 
} 

- (void) requestFailure:(NSURLRequest *)request 
       response:(NSURLResponse *)response 
        error:(NSError **)error 
        json:(id)JSON 
{ 
    // Failure code 
} 

... 

AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     requestsuccess:^(NSURLRequest *request, NSURLResponse *response, id JSON) 
     { 
      [self requestSuccess:request response:response json:JSON]; 
     } 
     failure:^(NSURLRequest *request, NSURLResponse *response, NSError *error, id JSON)) 
     { 
      [self requestFailure:request response:response error:error json:JSON]; 
     }] 

आप मैक्रो के साथ आगे जा सकते हैं, या यहाँ तक performSelector/NSInvocation मज़ा है - चाहे वह यह आप पर निर्भर है लायक है।

तुम भी कॉल खुद से पहले ब्लॉक परिभाषाओं स्थानांतरित कर सकते हैं, की तर्ज पर:

var = block; 
[object method:var]; 

जो तुम दृष्टिकोण चुनें शैली की बात है।

संबंधित मुद्दे

 संबंधित मुद्दे