2010-03-22 7 views
7

में बंद होने की कमी से निपटना शायद यह तथ्य है कि मैं हाल ही में http://nodejs.org/ का उपयोग कर रहा हूं, लेकिन उद्देश्य-सी (आईफोन) में बंद होने की कमी वास्तव में काम करना मुश्किल रही है।उद्देश्य-सी

उदाहरण के लिए, मैं सेवा कक्षाएं बना रहा हूं। प्रत्येक सेवा वर्ग में कई विधियां हो सकती हैं, जिनमें से प्रत्येक एक अलग यूआरएल अनुरोध करता है। मैं प्रतिनिधि पैटर्न का उपयोग कर सकता हूं, लेकिन इसका मतलब है कि हर बार जब मैं उस पर एक विधि कॉल करना चाहता हूं तो मुझे एक नई सेवा बनाना है (क्योंकि इसे उस अनुरोध के लिए प्रतिनिधि और चयनकर्ता को स्टोर करना है, और नई विधि कॉल उन्हें ओवरराइट कर देगी) ।

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

आप इसे कैसे करते हैं? क्या मुझे सिर्फ चमकना छोड़ देना चाहिए और इसे एक और तरीका करना चाहिए?

+0

मुझे लगता है कि दोनों को हल करने के लिए एक बदसूरत तरीका है जिसे मैं स्टोर करने की ज़रूरत है, जैसे "methodOneDelegate" और "methodTwoDelegate" और "methodOneDataINeedToKeepAround" के लिए कक्षा चर बनाने के लिए है। तुम्हें नया तरीका मिल गया है। –

उत्तर

10

Blocks, जिन्हें हाल ही में उद्देश्य-सी में पेश किया गया था, बंद करने में सक्षम हैं। एकमात्र समस्या यह है कि आप उन्हें आईफोन पर इस्तेमाल नहीं कर सकते हैं। यहां 3-rd पार्टी समाधान आता है, Plausible Blocks - वे आईफोन पर भी इस क्षमता को लाते हैं।

अपडेट: आईफोन पर ब्लॉक का उपयोग कर नमूना प्रोजेक्ट here पाया जा सकता है।

+0

यदि व्यवहार्य ब्लॉक काम करता है, तो आपको हमेशा के लिए मेरी अपमानजनक प्रशंसा मिल जाएगी .... –

+0

मुझे पीबी साइट पर कोई कोड नमूना नहीं दिख रहा है। उनके पास सामान्य ब्लॉक के समान सटीक वाक्यविन्यास है? –

+0

मैंने उन्हें पहले से ही कुछ परियोजनाओं में इस्तेमाल किया था, लेकिन उन्होंने इसे विभिन्न कारणों से ऐप स्टोर में नहीं बनाया। लेकिन चूंकि निजी ढांचे का कोई उपयोग नहीं है, मुझे यकीन है कि ऐप्पल इस तरह के आवेदन को अस्वीकार नहीं करेगा। – zakovyrya

7

जब भी आपको खुद को कई प्रतिनिधियों की आवश्यकता होती है, तो उत्तर अधिसूचनाएं होती हैं।

सेवा कक्षा की तरह कुछ के लिए आप शायद एक सिंगलटन बनाते हैं, और एक सूचना अनुरोध के दौरान एक सेवा अनुरोध पूरा होने पर इच्छुक पार्टियों को सूचित करते हैं।

नहीं कि ब्लॉक उस समस्या का एक दिलचस्प समाधान नहीं हैं, यह सिर्फ इतना है कि मुझे लगा कि आपको पता होना चाहिए कि विकल्प हैं।

+0

हू ... यह उस दृष्टिकोण के ध्रुवीय विपरीत जैसा है जिसे मैं लेना चाहता था (यह बुरा नहीं है) क्योंकि बंद जानकारी सूचना को स्थानांतरित करती है, जबकि नोटिफिकेशन पूरी तरह वैश्विक हैं। दिलचस्प। –

+0

मैं तर्क दूंगा कि नोटिफिकेशन स्वाभाविक रूप से स्थानीय हैं, क्योंकि केवल उन्हें लेने वाले वर्गों को पता है कि वे मौजूद हैं। वे सिर्फ एक वैश्विक बस पर यात्रा करने के लिए होते हैं ... वैसे ही सिंगलेट वैश्विक दिखाई देते हैं, लेकिन आप वस्तुओं के पूल के संदर्भों को अलग करने के लिए उनका उपयोग करते हैं। –

+1

हालांकि यह एक समाधान है, मुझे लगता है कि यह कोडिंग और प्रदर्शन के मामले में ब्लॉक का उपयोग करने से अधिक भारी वजन है। प्रदर्शन के संदर्भ में – zakovyrya

1

मैं एक समर्थक नहीं हूँ, लेकिन मैं एक ही समस्या के साथ संघर्ष कर रहा है इसलिए यहाँ सबसे अच्छा मैं अब तक कर लिया है:

@interface MyCallback : NSObject 
    id target; 
    SEL action; 
    id value1; 
    id value2; 
    ... 
@end 

मैं कुछ है कि मेरे बारे में सूचित करेंगे कॉल करने के लिए की जरूरत है पूरा होने पर मैं वास्तविक कॉलबैक (आमतौर पर "स्वयं" और एक विधि) के साथ सेट लक्ष्य और क्रिया को भरता हूं और अन्य मानों को सामान देता हूं, मुझे बाद में मूल्य 1 में आवश्यकता होगी ..2.3। कैली MyCallback ऑब्जेक्ट पर लटकती है और जब समय आता है लक्ष्य/क्रिया और MyCallback को पैरामीटर के रूप में पास करता है। इस तरह मैं अपना "बंद" प्राप्त करता हूं।

अपनी दूसरी समस्या का समाधान करने के लिए यहां एक विचार है: NSURLConnection से व्युत्पन्न कक्षा बनाएं, जिसे MyURLConenction कहा जाता है, और केवल अतिरिक्त प्रकार "आईडी" प्रकार का क्षेत्र है, इसे MyStuff कहते हैं। फिर NSURLConnection के बजाय MYURLConenction का उपयोग करने के लिए आगे बढ़ें - जब आप नेटवर्क अनुरोध करते हैं तो आप MyStuff में अपना डेटा (जैसे MyCallback का उदाहरण) भर सकते हैं और यह आपके लिए उनके लिए लटका होगा। इसलिए आपको प्रत्येक आमंत्रण के लिए अपनी सेवा कक्षा का एक नया उदाहरण बनाने की आवश्यकता नहीं होगी।

यह वास्तव में नहीं है मैं इसे कैसे हालांकि करते हैं - मैं बस, एक सामान्य MyHTTPRequest आवरण वर्ग NSURLConnection के प्रतिनिधि है कि बनाया उसे URL & NSString पोस्ट शरीर को स्वीकार करता है, सभी नेटवर्क सामान संसाधित करता है और एक NSString परिणाम देता है और कॉलर के लिए एक एनएसईआरआरआर - थोड़ा अधिक अमूर्तता। यह माईस्टफ को भी स्टोर करता है, ताकि सेवा कक्षाएं सिंगलटोन रह सकें यदि वे चाहें।

+0

हाँ, मैंने उस दृष्टिकोण को माना है। यह अच्छी तरह से काम करता है, लेकिन कॉलबैक पर पास-थ्रू डेटा डालने और फेंकने के लिए परेशान है। यद्यपि मैंने जो उदाहरण दिया है वह सही उपयोग-मामला नहीं हो सकता है, लेकिन ब्लॉकों वास्तव में कॉलबैक को चारों ओर रखने के लिए सबसे अच्छा तरीका है। धन्यवाद! –

+0

निश्चित रूप से, ब्लॉक बेहतर हैं। व्यक्तिगत रूप से मैं हैक अप कंपाइलर का उपयोग करने के लिए बहुत शर्मीली हूं (भगवान जानता है कि किस प्रकार की बग हैं) इसलिए मैं मौजूदा उपकरणों के साथ करता हूं। – DenNukem

+0

क्या, आप नहीं चाहते हैं कि यादृच्छिक बग सड़क के नीचे 6 महीने तक चले जाएं? साहस की भावना कहां है? : डी –