दिलचस्प पोस्ट
Angular2 में templateUrl को परिभाषित करने के लिए चर का उपयोग कैसे करें (नया ऐरे (10))। नक्शा (कार्य () {वापसी 1;}) देता है … क्यों? जावास्क्रिप्ट ऑब्जेक्ट पुश () फ़ंक्शन किस उपयोगकर्ता को स्क्रिप्ट चलाने के द्वारा क्रॉन्टाब में निर्दिष्ट किया जाए? JQuery खींचने और ड्रॉप का उपयोग करने के बाद मैं समन्वय स्थिति कैसे प्राप्त करूं? Microsoft Visual Studio 2013 के WinForms में MySQL (सी #) के लिए इकाई फ़्रेमवर्क 6 सक्षम करें MySQL # 1093 – आप एफआरएम क्लॉज में अपडेट के लिए लक्ष्य तालिका 'गेटवे' निर्दिष्ट नहीं कर सकते कैसे PHP में एक फ़ाइल एक्सटेंशन (निकालने) प्राप्त करने के लिए? टंकिनर जीयूआई के लिए कमांड लाइन परिणाम पुनर्निदेशित करें गेट से मैन्युअल रूप से HTTP अनुरोध भेजें डायनामिक पेपल बटन पीढ़ी – यह बहुत असुरक्षित नहीं है? जावा में एक eval () फ़ंक्शन है? क्या हम इंट-फ्लोट जैसी अंतर्निहित प्रकारों के लिए ऑपरेटर अधिभार कर सकते हैं? PhotoPicker खोज त्रुटि: त्रुटि डोमेन = प्लगइनकिट कोड = 13 Jquery रीसाइजिंग छवि

आईओएस – कई तर्कों और बाद में डेला के साथ प्रदर्शन करने वाले को कार्यान्वित कैसे करें?

मैं एक आईओएस नौसिखिया हूं मेरे पास एक चयनकर्ता विधि है –

- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { } 

मैं इस तरह से कुछ को लागू करने की कोशिश कर रहा हूं –

 [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0]; 

लेकिन यह मुझे एक त्रुटि बताता है –

 Instance method -performSelector:withObject:withObject:afterDelay: not found 

क्या मैं याद कर रहा हूँ के रूप में किसी भी विचार?

Solutions Collecting From Web of "आईओएस – कई तर्कों और बाद में डेला के साथ प्रदर्शन करने वाले को कार्यान्वित कैसे करें?"

निजी तौर पर, मुझे लगता है कि आपकी जरूरतों के लिए करीब से समाधान एनएसआईएनवोकेशन का उपयोग है।

कुछ ऐसा ही काम करेगा:

इंडेक्सपाथ और डेटास्रोत एक ही विधि में परिभाषित दो उदाहरण चर हैं

 SEL aSelector = NSSelectorFromString(@"dropDownSelectedRow:withDataSource:"); if([dropDownDelegate respondsToSelector:aSelector]) { NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[dropDownDelegate methodSignatureForSelector:aSelector]]; [inv setSelector:aSelector]; [inv setTarget:dropDownDelegate]; [inv setArgument:&(indexPath) atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation [inv setArgument:&(dataSource) atIndex:3]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation [inv invoke]; } 

क्योंकि [NSObject performSelector:withObject:withObject:afterDelay:] साथ ऐसी कोई वस्तु नहीं है, जिसके साथ [NSObject performSelector:withObject:withObject:afterDelay:] मेथड।

आपको कुछ एकल उद्देश्य सी ऑब्जेक्ट (उदाहरण के लिए एक एनएसएआरए, एक NSDictionary, कुछ कस्टम उद्देश्य सी प्रकार) में भेजना चाहते हैं और फिर इसे [NSObject performSelector:withObject:afterDelay:] विधि से अच्छी तरह से [NSObject performSelector:withObject:afterDelay:] ज्ञात और प्यार करता था

उदाहरण के लिए:

 NSArray * arrayOfThingsIWantToPassAlong = [NSArray arrayWithObjects: @"first", @"second", nil]; [self performSelector:@selector(fooFirstInput:) withObject:arrayOfThingsIWantToPassAlong afterDelay:15.0]; 

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

एक और विकल्प है प्रेषण- बाद में, जो एक ब्लॉक ले जाएगा और इसे किसी निश्चित समय पर एन्क्यू करे।

 double delayInSeconds = 15.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self fooFirstInput:first secondInput:second]; }); 

या, जैसा कि आप पहले से ही खोज चुके हैं, अगर आपको देरी की आवश्यकता नहीं है, तो आप केवल इसका उपयोग कर सकते हैं - performSelector:withObject:withObject:

एक सरल पैरामीटर को एक ही पैरामीटर को लेने के लिए अपनी विधि को संशोधित करना है, जैसे कि एक NSArray या NSDictionary (या दूसरी विधि जोड़कर जो एक पैरामीटर लेता है, इसे अनपैक करता है, और पहली विधि को कॉल करता है, और फिर दूसरी विधि को कॉल करें देरी पर)।

उदाहरण के लिए, आप कुछ ऐसा कर सकते हैं:

 - (void) fooOneInput:(NSDictionary*) params { NSString* param1 = [params objectForKey:@"firstParam"]; NSString* param2 = [params objectForKey:@"secondParam"]; [self fooFirstInput:param1 secondInput:param2]; } 

और फिर इसे कॉल करने के लिए, आप यह कर सकते हैं:

 [self performSelector:@selector(fooOneInput:) withObject:[NSDictionary dictionaryWithObjectsAndKeys: @"first", @"firstParam", @"second", @"secondParam", nil] afterDelay:15.0]; 
 - (void) callFooWithArray: (NSArray *) inputArray { [self fooFirstInput: [inputArray objectAtIndex:0] secondInput: [inputArray objectAtIndex:1]]; } - (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second { } 

और इसके साथ कॉल करें:

 [self performSelector:@selector(callFooWithArray) withObject:[NSArray arrayWithObjects:@"first", @"second", nil] afterDelay:15.0]; 

आप प्रदान किए गए सभी प्रकार के निष्पादनकर्ताओं को पा सकते हैं: यहां तरीकों से:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html

इसमें कई भिन्नताएं हैं लेकिन कोई ऐसा संस्करण नहीं है जिसमें कई ऑब्जेक्ट्स और साथ ही विलंब होता है। आपको अपने तर्क को एक NSArray या NSDictionary के बजाय ऊपर लपेटने की आवश्यकता होगी

 - performSelector: - performSelector:withObject: - performSelector:withObject:withObject: – performSelector:withObject:afterDelay: – performSelector:withObject:afterDelay:inModes: – performSelectorOnMainThread:withObject:waitUntilDone: – performSelectorOnMainThread:withObject:waitUntilDone:modes: – performSelector:onThread:withObject:waitUntilDone: – performSelector:onThread:withObject:waitUntilDone:modes: – performSelectorInBackground:withObject: 

मैंने बस कुछ स्विजिंग किया और मूल विधि को कॉल करने की जरूरत है। मैंने जो किया वह एक प्रोटोकॉल बना रहा था और मेरी ऑब्जेक्ट इसे करने के लिए किया था। एक अन्य तरीके से श्रेणी में विधि को परिभाषित करना है, लेकिन चेतावनी के दमन की आवश्यकता होगी (#pragma clang diagnostic की उपेक्षा "-विमुक्त पूर्ण-कार्यान्वयन")।

मुझे एनएसआईएनवॉन्शन मार्ग पसंद नहीं है, बहुत जटिल है चलो इसे सरल और साफ रखें:

 // Assume we have these variables id target, SEL aSelector, id parameter1, id parameter2; // Get the method IMP, method is a function pointer here. id (*method)(id, SEL, id, id) = (void *)[vc methodForSelector:aSelector]; // IMP is just a C function, so we can call it directly. id returnValue = method(vc, aSelector, parameter1, parameter2);