2012-03-09 20 views
39

के साथ कई तर्कों की विधि को कॉल करने का तरीका मैं कुछ देरी के बाद एक विधि कॉल करने का प्रयास कर रहा हूं।विलंब

मुझे पता है कि उस के लिए एक समाधान है:

[self performSelector:@selector(myMethod) withObject:nil afterDelay:delay]; 

मैं this question और Documentation

देखा लेकिन मेरे सवाल यह है: मैं एक विधि है कि दो पैरामीटर लेता कॉल कर सकते हैं कैसे ??

उदाहरण के लिए

:

- (void) MoveSomethigFrom:(id)from To:(id)to; 

मैं देरी से इस विधि कैसे कहेंगे, का उपयोग कर performSelector:withObject:afterDelay:

धन्यवाद

+0

https://github.com/ariel2010/CALayerAnimTest –

उत्तर

111

उपयोग dispatch_after:

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    //code to be executed on the main queue after delay 
    [self MoveSomethingFrom:from To:to]; 
}); 

संपादित करें 2015: स्विफ्ट के लिए, मैं इस छोटी सहायक विधि का उपयोग करने की सलाह देता हूं: dispatch_after - GCD in swift?

+2

या तो उस, या आप के रूप में कई मापदंडों के रूप में आप चाहते हैं एक कंटेनर में डाल दिया और इसे भेज सकते हैं 'प्रदर्शन चयनकर्ता: withObject: afterDelay' विधि के लिए एक तर्क के रूप में। – Alexander

+0

यह एक अच्छा दृष्टिकोण प्रतीत होता है, यह वास्तव में कॉल में देरी करता है। लेकिन यह कुछ अजीब होता है, विधि जो अपेक्षा की जाती है वह नहीं करता है, कुछ और करता है, जिसे मैं समझ भी नहीं सकता .. – Frade

+0

इसे मिला .. यह कुछ कोड था जो देरी के दौरान निष्पादित किया गया था .. धन्यवाद – Frade

6

अन्य उपाय:

1) आप NSInvocations इस्तेमाल कर सकते हैं:

+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature
(>>Eldar Markov's answer देख)

प्रलेखन:
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/Reference/Reference.html

2) आप हमें कर सकते हैं ईए सहायक विधि ..

[self performSelector:@selector(helperMethod) withObject:nil afterDelay:delay]; 

- (void) helperMethod 
{ 
    // of course x1 and x2 have to be safed somewhere else 
    [object moveSomethigFrom: x1 to: x2]; 
} 

3) आप किसी सरणी या पैरामीटर के रूप में एक शब्दकोश का उपयोग कर सकते ..

NSArray* array = [NSArray arrayWithObjects: x1, x2, nil]; 
[self performSelector:@selector(handleArray:) withObject:array afterDelay:delay]; 

- (void) handleArray: (NSArray*) array 
{ 
    [object moveSomethigFrom: [array objectAtIndex: 0] to: [array objectAtIndex: 1]]; 
} 
+0

सही .. संपादित करेंगे। – calimarkus

+0

एक सुझाव के रूप में, एसओ पर अन्य उत्तरों को "ऊपर" या "नीचे" होने के रूप में संदर्भित न करें, क्योंकि उन्हें एक से अधिक तरीकों से क्रमबद्ध किया जा सकता है, और अधिकांश लोग रेटिंग द्वारा क्रमबद्ध होते हैं, जो अस्थिर हो सकते हैं। मैं जवाब के नीचे "शेयर" बटन मारने का सुझाव देता हूं और इसके लिए एक लिंक साझा करता हूं, क्योंकि एक प्रश्न को बड़ी संख्या में उत्तरों के साथ समाप्त होता है। – ArtOfWarfare

+0

अच्छा बिंदु। अपडेट करूंगी। – calimarkus

7

तुम भी NSInvocation वस्तु का उपयोग कर (NSObject के वर्ग में विधि लागू कर सकते हैं के सभी संस्करणों में काम करता है iOS)। मुझे लगता है कि यह कुछ ऐसा होना चाहिए:

@interface NSObject(DelayedPerform) 

- (void)performSelector:(SEL)aSelector withObject:(id)argument0 withObject:(id)argument1 afterDelay:(NSTimeInterval)delay { 

    NSMethodSignature *signature = [self methodSignatureForSelector:aSelector]; 

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
    [invocation setTarget:self]; 
    [invocation setSelector:aSelector]; 
    [invocation setArgument:&argument0 atIndex:2]; 
    [invocation setArgument:&argument1 atIndex:3]; 

    [invocation performSelector:@selector(invoke) withObject:nil afterDelay:delay]; 

} 

@end 
+0

आईओएस> = 3.2 के बारे में क्या ?? – Frade

+0

आप इसका उपयोग> = 3.2 में भी कर सकते हैं। मैं सिर्फ यह दिखाना चाहता था कि जीसीडी का उपयोग करना जरूरी नहीं है। मैं अपना मूल उत्तर संपादित करूंगा) –

+0

ठीक है .. मुझे खेद है, लेकिन जीसीडी क्या है? इसका उपयोग करने में समस्या क्या है? – Frade

0

ये सभी काम करेंगे, लेकिन सभी आवश्यकतानुसार अधिक जटिल हैं।

एनएस डिक्शनरी तर्क के साथ बुलाए जाने के तरीके को डिज़ाइन करें। वस्तुओं को उसमें रखें जो आपको चाहिए।

यदि आप अन्य तरीकों से विधि को सुलभ करना चाहते हैं, तो इसके बजाय कॉल को 'अनचाहे' करें और स्पष्ट पैरामीटर के साथ इच्छित विधि को कॉल करें।

2

स्विफ्ट:

runThisAfterDelay(seconds: 5) {() ->() in 
    print("Prints this 5 seconds later in main queue") 
    //Or perform your selector here 
} 

/// EZSwiftExtensions 
func runThisAfterDelay(seconds seconds: Double, after:() ->()) { 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC))) 
    dispatch_after(time, dispatch_get_main_queue(), after) 
} 

तर्क गणना वास्तव में कोई फर्क नहीं पड़ता:

let delayInSeconds = 3.0; 
    let delay = delayInSeconds * Double(NSEC_PER_SEC) 
    let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)); 
    dispatch_after(popTime, dispatch_get_main_queue(), { 
     // DO SOMETHING AFTER 3 sec 
    }); 
+0

धन्यवाद, अलेक्जेंडर! – Frade

1

का तरीका यहां बताया स्विफ्ट में विलंब के बाद एक ब्लॉक को गति प्रदान कर सकते हैं।

इसकी मेरी रेपो में एक मानक समारोह के रूप में शामिल हैं: https://github.com/goktugyil/EZSwiftExtensions

+0

मदद के लिए धन्यवाद! – Frade

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