2015-03-14 3 views
-2

Это мой метод с двумя параметрами: imgArray и andDurationArray. Я хочу назвать этот же метод с теми же двумя параметрами, в моем разделе else, по performSelector. Как я могу это назвать? Заранее большое спасибо.Метод вызова с несколькими параметрами performSelector ios

-(void) imageAnimationWithImage:(NSArray *) imgArray andDurationArray:(NSArray *) durationArr 
{ 
    if (count == imgarray.count) 
    { 
     count = 0; 
     [self imageAnimationWithImage:imgarray andDurationArray:durationArr]; 
    } 
    else 
    { 
     emoImageView.image = [UIImage imageNamed:[imgarray objectAtIndex:count]]; 
     [self performSelector:@selector(imageAnimationWithImage:andDurationArray:) withObject:imgarray withObject:durationArr afterDelay:[[durationArr objectAtIndex:count] doubleValue]]; 
     count++; 
    } 
} 

ответ

3

Использование dispatch_after. Это намного проще:

double delay = [[durationArr objectAtIndex:count] doubleValue]; 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [self imageAnimationWithImage:imgarray andDurationArray:durationArr]; 
}); 
+0

Он отлично работает. :) Огромное спасибо. – Tulon

3

Почему бы вам не использовать NSInvocation он подходит лучше с несколькими аргументами, второй стоит обратить внимание, что вы создаете метод с высоким риском рекурсии

NSInteger delay = [[durationArr objectAtIndex:count] doubleValue]; 
    SEL aSelector = @selector(imageAnimationWithImage:andDurationArray:); 
    NSMethodSignature *signature = [self methodSignatureForSelector:aSelector]; 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
    [invocation setTarget:self]; 
    [invocation setSelector:aSelector]; 
    [invocation setArgument:&imgarray atIndex:2]; 
    [invocation setArgument:&durationArr atIndex:3]; 

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

Спасибо за ваш комментарий. Я это понимаю, кроме 3 строк. Не могли бы вы объяснить мне это? Первый: '[invocation setArgument: & imgarray atIndex: 2];' Почему вы установили индекс в 2? Второй: '[invocation setArgument: & durationArr atIndex: 3];' Почему вы установили индекс в 3? Третий: [invocation performSelector: @selector (invoke) withObject: nil afterDelay: delay]; Откуда взялось обращение? – Tulon

+0

Индексы 0 и 1 указывают скрытые аргументы self и _cmd соответственно; вы должны установить эти значения непосредственно с целевыми и селекторными свойствами. «Вызывать» - это методы, запускающие вызов https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/index.html#//apple_ref/occ/instm/NSInvocation/setArgument: atIndex: – Andrea

+0

Отлично. Понял. Но использовать 'dispatch_after' проще, я думаю. Спасибо, что представили мне что-то новое. – Tulon

1

performSelector:withObject:afterDelay Метод будет только работы с 0 или 1 параметрами. Вы можете упаковывать свои параметры в словарь и передавать это, или использовать dispatch_after, который наследует область приложения, и поэтому не нуждается в параметрах.

+0

Да, я собираюсь использовать 'dispatch_after'. Но спасибо за объяснение. :) – Tulon

+0

Я создал категорию NSObject, которая добавляет метод 'performBlock: afterDelay:'. (Внутри он использует dispatch_after.) Я добавляю это ко всем моим проектам, а затем просто использую это. Легче запомнить (и читать), чем довольно сложный синтаксис dispatch_after. –