Установка задержки без спящего объектива-c - PullRequest
2 голосов
/ 13 марта 2012

В настоящее время я делаю целевую программу c, в которой на экране 4 фигуры. Формы должны быть выделены на основе последовательности вставок, и только одна фигура должна выделяться одновременно. Таким образом, я должен добавить задержку после того, как каждая фигура была выделена. Использование 'sleep' приводит к тому, что программа ведет себя очень странно, и единственный способ, с помощью которого я могу подумать о ее задержке, это использовать 'executeSelector: withObject: afterDelay:', но метод, который я хочу передать как селектор, принимает несколько аргументы, которые он не допустит.

Итак, мой вопрос заключается в следующем: возможно ли передать метод с несколькими аргументами в 'executeSelector: withObject: afterDelay?' Если нет, то какие еще способы добавить задержку в программу без ожидания потока?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 марта 2012

Передать все аргументы в NSDictionary

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"Object1", @"key1", @"Object2", @"key2", nil];  

//performSelector:withObject:dict afterDelay
 //  [self performSelector:@selector(aSelector) withObject:dict afterDelay:(NSTimeInterval)delay ];

-(void)aSelector : (NSDictionary *)dict
{
    id lFirstArg = [dict objectForKey:@"Key1"]
    ...
}

Если вы не хотите менять метод Signature, используйте NSInvocation. Взгляните на этот SEL executeSelector и аргументы post.

-(void)myMethodWith:(int)number andBOOL:(BOOL) someBool andStr:(NSString *)str{
    NSLog(@"%d %d %@",number,someBool,str);
}

-(void) testMethod{
    SEL sel = @selector(myMethodWith:andBOOL:andStr:);
    int i = 10;
    BOOL bol = YES;
    NSString *str = @"Hello !";
    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:sel]];
    [inv setSelector:sel];
    [inv setTarget:self];
    [inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
    [inv setArgument:&bol atIndex:3];
    [inv setArgument:&str atIndex:4];
    [inv performSelector:@selector(invoke) withObject:nil afterDelay:30];
}
...