2012-05-09 6 views
17

यह पहली बार है जब मैं आईओएस 5 और एआरसी के साथ घूम रहा हूं। अब तक, यह अच्छा है, यह काम करता है, लेकिन मैं किसी तरह की समस्या में भाग गया हूं।आईओएस और एआरसी: एसिंक्रोनस ऑपरेशंस के दौरान स्वयं को कैसे बनाए रखें?

मेरे पास एक कस्टम UIStoryboardSegue है जिसमें मैं अपने ऐप में उपयोगकर्ता को लॉग इन करने के लिए फेसबुक कनेक्ट (या अन्य सेवाएं) का उपयोग करता हूं। सीधे शब्दों में कहें, तो निम्न कार्य करना चाहिए: बटन

  • बटन Segue
  • segue अतुल्यकालिक लॉगिन शुरू होता है, लेकिन तुरंत दृश्य नियंत्रक
  • तो धक्का नहीं है, और केवल आग पर

    1. उपयोगकर्ता क्लिक करता है यदि लॉगिन सफल होता है, segue दृश्य नियंत्रक

    धक्का क्या बजाय होता है, जिसे प्रवेश शुरू होता है, लेकिन इससे पहले कि यह पूरा करने के लिए किसी भी मौका है segue तुरंत एआरसी द्वारा जारी की है।

    मैं एक quick'n'dirty के बारे में सोचा रोकने के लिए हैक इस:

    @interface BSLoginSegue() { 
        __strong BSLoginSegue *_retained_self; 
    } 
    @end 
    
    // Stuff... 
    // Other stuff... 
    
    - (void) perform { 
        login(); 
        _retained_self = self; 
    } 
    
    - (void) loginServiceDidSucceed:(BSLoginService *)svc { 
        ... 
        _retained_self = nil; 
    } 
    

    बात यह वास्तव मेंहैक है, है, इसलिए यदि आपका कोई और थे मैं सोच रहा था, और मैं और भी सुरुचिपूर्ण तरीका कर सकता था?

  • +1

    क्या मैं आपका लॉगिन कोड देख सकता हूं? – jajo87

    +0

    यदि आप उस मामले को संभालते हैं जहां लॉगिन विफल रहता है, तो मैं व्यक्तिगत रूप से यह एक हैक पर विचार नहीं करता :) –

    +0

    @ निकएच 247: बेशक, मैं यहां कोड को स्वेच्छा से समझने के लिए सब कुछ छीन लेता हूं;) –

    उत्तर

    3

    यह विचार कि एक वर्ग को खुद को बनाए रखने की आवश्यकता है, यह सुझाव देता है कि एक डिजाइन समस्या हो सकती है। जब कोई वस्तु स्वयं को बरकरार रखती है, तो यह अस्पष्ट हो जाता है कि इसका मालिक कौन है या इसका संदर्भ कौन हो सकता है, और रिसाव का खतरा अधिक है।

    सेग पेश करने के लिए कौन सी कक्षा जिम्मेदार है? क्या यह वही कक्षा है जिसमें बटन है? इस वर्ग को segue को बनाए रखना चाहिए, segue प्रस्तुत करना चाहिए, और फिर segue को पूरा करते समय segue जारी करना चाहिए।

    दृश्य नियंत्रक पदानुक्रम में और अंतर्दृष्टि के बिना, विशिष्ट सलाह देना मुश्किल है। लेकिन मेरी पहली प्रतिक्रिया यह सुझाव देना है कि दृश्य नियंत्रक जो सेग्यू पेश करने का निर्णय ले रहा है या नहीं, उसके पास सीगू पर मजबूत संपत्ति होनी चाहिए। उपclassed segue एक प्रोटोकॉल को परिभाषित कर सकता है कि प्रस्तुत वर्ग को सलाह दी जा सकती है कि जब सेग्यू को निलंबित/जारी किया जाना चाहिए।

    +0

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

    +0

    आपने इसे एक मजबूत संदर्भ कैसे बनाया? जब आप कहते हैं कि UIKit द्वारा बनाया गया है, तो क्या आपका मतलब है कि आपने इसे स्टोरीबोर्ड में बनाया है और इसलिए आप इसे कोड में तत्काल नहीं कर रहे हैं? – isaac

    +0

    मैंने इसे एक मजबूत संदर्भ नहीं बनाया, मैं कोशिश करना चाहता था, लेकिन फिर मैंने कुछ और के बारे में सोचा: आप मेरे लॉगिन वर्ग को अपने प्रतिनिधि (सीगू) के सक्रिय संदर्भ के दौरान एक मजबूत संदर्भ बनाए रखने के बारे में क्या सोचते हैं, और फिर सेटिंग जब यह नहीं है तो यह शून्य हो जाएगा? इसके अलावा, हाँ, मैंने इसे स्टोरीबोर्ड के अंदर जोड़ा और आगे परेशान नहीं किया। –

    8

    आप एक Objective-C block में अपने ऑब्जेक्ट के संदर्भ डालने और यह GCD में पास करके Grand Central Dispatch (GCD) संगामिति के लिए (जो आपको चाहिए, यह भयानक है!) का उपयोग करते हैं तो, यह स्वतः के बाद जब तक ब्लॉक द्वारा रखी जाएगी ब्लॉक निष्पादित किया गया है और खुद को जारी किया गया है।

    यह जानने के बिना कि आप अपने एसिंक ऑपरेशन कैसे कर रहे हैं, यह एक निश्चित उत्तर देना मुश्किल है, लेकिन blocks और GCD का उपयोग करके आपको इस बारे में चिंता करने की आवश्यकता नहीं होगी। ब्लॉक इसे संदर्भित वस्तुओं को बनाए रखने का ख्याल रखेगा और एआरसी बाकी करेगा।

    ऐसा लगता है कि आपको loginServiceDidSucceed: पर कॉल करने के लिए कहीं भी अपने UIStoryboardSegue सबक्लास का संदर्भ संग्रहीत करना होगा, इसलिए शायद यह एक मजबूत संदर्भ काम करेगा। एक बार फिर, इसे block से संदर्भित करना (जैसे लॉगिन सफल होने पर पूर्णता ब्लॉक) आदर्श है। मैं सफलता/विफलता कॉलबैक के लिए ब्लॉक का उपयोग करने के लिए अपने लॉगिन कोड को अनुकूलित करने की अनुशंसा करता हूं।

    +0

    उत्तर के लिए धन्यवाद! मुझे यकीन है कि यह ब्लॉक के साथ और अधिक कुशल होगा, लेकिन जिज्ञासा के लिए, क्या कुछ प्रकार की निम्न-स्तरीय विधि है जिसका उपयोग मैं विशेष मामलों में वस्तुओं को बनाए रखने/जारी रखने के लिए कर सकता हूं? –

    +0

    ठीक है अगर आप वास्तव में इसे हैक करना चाहते हैं तो आप इसे बनाए रखने और इस तरह से रिलीज कर सकते हैं कि संकलक इस बारे में पता नहीं लगा सकता और शिकायत नहीं कर सकता है (यह काफी आसान है, लेकिन मैं इसे एक अभ्यास के रूप में छोड़ दूंगा)। हालांकि, यह स्थिति एक अच्छा संकेत है कि आपने अपनी कक्षाओं को खराब तरीके से संरचित किया है (उद्देश्य के अर्थ में कौन है 'के मालिक' के संदर्भ में) और मैं अत्यधिक अनुशंसा करता हूं कि आप इसके बजाय देखें। :) – jhabbott

    0

    बस जोड़ सकते हैं और करने के लिए/self को दूर एक सरणी self के एक डेटा सदस्य है कि इस प्रकार से:

    @interface MyClass 
    { 
        NSMutableArray* _selfRetains; 
    } 
    @end 
    
    @implementation MyClass 
    -(id)retainSelf 
    { 
        [_selfRetains addObject:self]; 
        return self; 
    } 
    -(void)releaseSelf 
    { 
        [_selfRetains removeLastObject]; 
    } 
    @end 
    

    फिर, [self retainSelf] और [self releaseSelf] साथ [self release] साथ [self retain] बदलें।

    जबकि अन्य उत्तरों सही हैं, और आपको आम तौर पर एक ऐसे डिज़ाइन से बचना चाहिए जिसके लिए कक्षा को स्वयं को बनाए रखने की आवश्यकता होती है, इस कामकाज के लिए आपको अपने ऐप के डिज़ाइन को महत्वपूर्ण रूप से बदलने की आवश्यकता नहीं होती है।

    -1

    यदि आपको एसिंक ऑपरेशन में अपना स्वयं का उदाहरण बनाए रखने की आवश्यकता है तो सिंगलटन आपकी पसंद हो सकती है।

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