39 votes

comment appeler une méthode de multiples arguments avec un délai de

J'essaie d'appeler une méthode, après un certain délai.

Je sais qu'il ya une solution pour cela:

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

J'ai vu cette question et de la Documentation

Mais ma question est: Comment puis-je appeler une méthode qui prend deux paramètres??

par exemple:

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

Comment pourrais-je appeler cette méthode avec retard, à l'aide de performSelector:withObject:afterDelay:

Merci

112voto

Martin Ullrich Points 5894

utilisation 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];
});

7voto

Eldar Markov Points 810

Vous pouvez également mettre en œuvre la méthode dans NSObject de la catégorie à l'aide de NSInvocation objet (fonctionne dans toutes les versions d'iOS). J'imagine que ça doit être quelque chose comme ceci:

@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

6voto

jaydee3 Points 6967

D'autres idées:

1) Vous pouvez utiliser NSInvocations:

+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature
(>> voir Eldar Markov réponse)

Documentation:
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/Reference/Reference.html

2) Vous pouvez utiliser une méthode d'aide..

[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) Vous pouvez utiliser un tableau ou un dictionnaire en paramètre..

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]];
}

2voto

Alexander Volkov Points 241

Swift:

    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
    });

0voto

tooluser Points 540

Ce seront tous les travaux, mais ils sont tous beaucoup plus complexe que ce qui est nécessaire.

La conception de la méthode à appeler avec un NSDictionary argument. Mettre les objets dont vous avez besoin.

Si vous voulez que la méthode pour être accessibles par d'autres moyens que l'appel au lieu d'une méthode qui "ouvre" le dictionnaire et appelle la méthode attendue explicite des paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X