Вы не можете использовать performSelectorInBackground:withObject:
для селекторов, которые принимают несколько аргументов. Предложения других ответов дают некоторую работу, но все они предполагают, что вы можете манипулировать методом, который вы вызываете, что не всегда возможно (или даже хорошая идея для ясности).
Вместо этого я рекомендую использовать NSInvocation, поскольку он допускает несколько аргументов или, альтернативно, с помощью GCD для отправки блока в фоновый режим (или любую другую очередь, кроме основной).
Вот пример использование NSInvocation
NSMethodSignature *sig = [[self class] instanceMethodSignatureForSelector:@selector(downloadImage_3:AtIndex:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setTarget:self];
[inv setSelector:@selector(downloadImage_3:AtIndex:)];
[inv setArgument:(__bridge void *)@"http://www.google.com" atIndex:2];
NSUInteger i = 1;
[inv setArgument:&i atIndex:3];
[inv performSelectorInBackground:@selector(invoke) withObject:nil];
Это стоит двойной проверки, я написал код в браузере, так что я мог бы что-то пропустил компилятор подберет.
В качестве дополнительного примечания вы должны действительно пересмотреть свои соглашения об именовании методов, гораздо более стандартный способ назвать методы будет иметь метод, который будет называться -(void)downloadImage3:(NSString*)path atIndex:(int)i
. Обратите внимание, как atIndex начинается с нижнего регистра и как нет подчеркивания (которое просто выглядит странно в середине имени метода). Также стоит отметить, что использование NSUInteger является предпочтительным для индекса, поскольку NSArray в целом работает с NSUIntegers (оба должны работать, но бывают случаи, когда int может не хватить).
Каково содержание '- (void) downloadImage_3: AtIndex:' метод? – Raptor
Что такое «я» здесь? Вы не можете добавить объект int к массиву. Так что это должен быть NSNumber. И в этом случае ваш параметр метода должен также иметь тип NSNumber. – Neha
'i' is' int' пришел из 'for loop' – Krunal