2013-02-06 17 views
14

मैंने देखा है कि UIImageView पर AFNetworking और SDWebImage श्रेणियों का एक ही विधि नाम है।उसी विधि पर दो श्रेणियां उसी विधि नाम के साथ

AFNetworking:

- (void)setImageWithURL:(NSURL *)url { 
    [self setImageWithURL:url placeholderImage:nil]; 
} 

- (void)setImageWithURL:(NSURL *)url 
     placeholderImage:(UIImage *)placeholderImage 
{ 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; 

    [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; 
} 

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
       placeholderImage:(UIImage *)placeholderImage 
         success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success 
         failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure 
{ 
... 
} 

और SDWebImage

- (void)setImageWithURL:(NSURL *)url 
{ 
    [self setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; 
} 

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder 
{ 
    [self setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; 
} 

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options 
{ 
    [self setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; 
} 

... 

Xcode में जब मैं SDWebImage विधि यह मेरे AFNetworking विधि और उपाध्यक्ष प्रतिकूल पर रीडायरेक्ट कमान-क्लिक करें।

मैं किस व्यवहार की अपेक्षा कर सकता हूं? क्या मुझे केवल उस श्रेणी में उचित श्रेणी के लिए हेडर शामिल करना चाहिए जिसमें मैं इसका उपयोग करना चाहता हूं? क्या होगा यदि एक ही वर्ग को श्रेणी के दोनों कार्यान्वयन का उपयोग करने की आवश्यकता हो?

एक अन्य संबंधित प्रश्न "What happens if two ObjC categories override the same method?" इस तरह से बिल्कुल समान नहीं है क्योंकि एएफनेटवर्किंग और एसडीवेब इमेज दोनों एक ही कक्षा में श्रेणियों को उप-वर्ग नहीं जोड़ रहे हैं। इस मामले में केवल एक बार कक्षा का उपयोग किया जा रहा है और 2 श्रेणियां संघर्ष में प्रतीत होती हैं।

+1

संबंधित: ["क्या होगा अगर एकाधिक श्रेणियां एक ही विधि को लागू करें?"] (Http://stackoverflow.com/a/1085500/335858)। – dasblinkenlight

+0

यह खराब है, और यही कारण है कि तृतीय-पक्ष ढांचे को उन तरीकों पर उपसर्गों का उपयोग करने की दृढ़ता से अनुशंसा की जाती है जो वे श्रेणियों के माध्यम से अन्य ढांचे के वर्गों में जोड़ते हैं। शीर्षलेख फ़ाइलों पर इसका कोई प्रभाव नहीं पड़ता है; रनटाइम श्रेणियों को लोड करता है, और ऑर्डर, और इसलिए आपके द्वारा कार्यान्वित कार्यान्वयन, अनिर्धारित है। –

+0

*** नहीं *** एक डुप्ली [क्या होता है यदि दो ओबीजेसी श्रेणियां एक ही विधि को ओवरराइड करती हैं?] (Http://stackoverflow.com/q/3221972) शायद एक डुप्ली [समान विधियों वाली श्रेणियों का उपयोग करके कक्षा को विस्तारित करना नाम] (http://stackoverflow.com/q/4764977), [ओबीजेसी में श्रेणियों का उपयोग करके विधियों को ओवरराइड करना] (http://stackoverflow.com/q/5272451), और [ओबीजेसी में श्रेणी के माध्यम से एक विधि ओवरराइड करें] (http : //stackoverflow.com/q/14259517) –

उत्तर

7

नाम टकराव वास्तव में ऐसा कुछ है जो उद्देश्य-सी रनटाइम में हो सकता है ... Apple advises the use of 'prefix' on methods names

अपेक्षित व्यवहार: रनटाइम द्वारा लोड की गई अंतिम श्रेणी/विधि प्रभावी होगी। यह कौन सा है? खराब सवाल!

मेरी सलाह: नाम बदलें!

+1

हेडर का इस व्यवहार पर कोई प्रभाव नहीं पड़ता है; अगर कार्यान्वयन फाइलों को संकलित किया जा रहा है, तो टक्कर होगी, और रनटाइम पर लोड करने का क्रम अपरिभाषित है (हालांकि संभवतः दोहराया जा सकता है)। –

+0

ओह, वास्तव में ... – Vinzzz

+0

तो कुछ परियोजनाओं के लिए उत्तर गिथब पर इन परियोजनाओं को फोर्क करना होगा और विधियों के नामों का नाम बदलना नहीं होगा, शायद उन्हें एक कोकोपॉड में पैकेज करें और उनके कोड के साथ आगे बढ़ें? शुक्र है कि मुश्किल नहीं है! – PaulWoodIII

8

नाम बदलें समस्या को हल करने का सबसे अच्छा तरीका हो सकता है प्रतीत नहीं होता है,

बस का उपयोग करें:

[cell.imageView setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"placeholder"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 

}]; 

SDWebImage से जो AFNetworking

+0

पर उल्लिखित उपसर्ग Vinzzz जोड़ा है हाँ यह सच है और उदाहरण के लिए काम करेगा, लेकिन उच्च स्तर पर, AFNetworking/SDWEbImageCache उदाहरण से दूर, "क्या होगा यदि एक ही कक्षा की जरूरत है श्रेणी के दोनों कार्यान्वयन का उपयोग करने के लिए? " मुझे लगता है कि अगर ऐसा है तो आपको श्रेणी का नाम बदलना चाहिए। – PaulWoodIII

2

में मौजूद नहीं है के लिए देख किसी को भी के लिए एसडीवेब इमेज और एएफनेटवर्किंग दोनों का उपयोग करें, यहां टॉइडिंग विधियों के उपयोग को हतोत्साहित करने के लिए मेरा गुफागार समाधान है:

https://gist.github.com/sibljon/5957892

यह स्पष्ट रूप से भविष्य का प्रमाण नहीं है, और अगर इन तरीकों के कार्यान्वयन AFNetworking या SDWebImage में बदलते हैं तो तोड़ने की संभावना है। यह एक आदर्श समाधान से बहुत दूर है। दूसरे शब्दों में, अपने जोखिम पर!

+0

जैसा कि मैं समझता हूं, विचार यह है कि विधि को प्रश्न में बहिष्कृत करना है। हालांकि, मुझे कोई चेतावनी नहीं मिली है। क्या यह भी निर्भर नहीं करता है कि किस श्रेणी का उपयोग किया जाता है? – Grav

+1

अगर मैंने टकराव विधि का उपयोग किया है, तो मैंने एक बिल्ड को रोकने का एक तरीका जोड़ा है। मैंने जिस्ट पर टिप्पणी की है। – Grav

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