2013-11-08 2 views
1

Я хочу вызвать этот метод в фоновом режиме,EXC_BAD_ACCESS на performSelectorInBackground

-(void)downloadImage_3:(NSString*)Path AtIndex:(int)i 

Я звоню в этом пути, но он выходит из строя и показывает EXC_BAD_ACCESS

[self performSelectorInBackground:@selector(downloadImage_3:AtIndex:) withObject:[NSArray arrayWithObjects:@"http://www.google.com",i, nil]]; 

Как звонить downloadImage_3: метод в фоновом режиме?

, где я делаю ошибку?

+0

Каково содержание '- (void) downloadImage_3: AtIndex:' метод? – Raptor

+0

Что такое «я» здесь? Вы не можете добавить объект int к массиву. Так что это должен быть NSNumber. И в этом случае ваш параметр метода должен также иметь тип NSNumber. – Neha

+0

'i' is' int' пришел из 'for loop' – Krunal

ответ

1

попробовать этот

[self performSelectorInBackground:@selector(downloadImage_3:AtIndex:) withObject:[NSArray arrayWithObjects:@"http://www.google.com",i, nil] afterDelay:15.0]; 

Или попробуйте это

NSString* number = [NSString stringWithFormat:@"%d",i]; 
NSArray* arrayValues = [[NSArray alloc] initWithObjects:[[msg_array objectAtIndex:i] valueForKey:@"Merchant_SmallImage"],number, nil]; 
NSArray* arrayKeys  = [[NSArray alloc] initWithObjects:@"Path",@"Index",nil]; 
NSDictionary* dic = [[NSDictionary alloc] initWithObjects:arrayValues forKeys:arrayKeys]; 
[self performSelectorInBackground:@selector(downloadImage_3:) withObject:dic]; 

Определить функцию downloadImage_3 так:

-(void)downloadImage_3:(NSDictionary *)dic 
{ 
    NSString *path = [dic valueForKey:@"Path"]; 
int i  = [[dic valueForKey:@"Index"] intValue]; 
    //Your code 
} 
+0

snob-z: Последовательность, которую вы передали для Словаря, неверна. dictionaryWithObjectsAndKeys сначала возьмет объект, а затем ключ для этого объекта – spaleja

+0

Извините. Я пропустил это. Благодарю. Я отредактировал свой ответ –

+0

Показывает EXC_BAD_ACCESS здесь 'NSDictionary * dictionary = [Словарь NSDictionaryWithObjectsAndKeys: [[msg_array objectAtIndex: i] valueForKey: @" Merchant_SmallImage "], @" Путь ", i," Индекс ", ноль];' – Krunal

1

Вы не можете вызвать параметризованную функцию в @selector. Создание NSDictionary, а затем передать этот словарь в withObject:

int atIndex = 2; // whatever index you want to pass 
NSArray *arr = [NSArray arrayWithObjects:obj1,obj2,nil]; 

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:atIndex],@"AtIndex",arr,@"ImagesUrl", nil]; 
[self performSelectorInBackground:@selector(downloadImage_3:) withObject:dictionary]; 

Определить downloadImage_3 функцию следующим образом:

-(void)downloadImage_3:(NSDictionary *)dic { 
    // use dic and write your code 
} 
+0

Значения не жестко запрограммированы как '1' и' 2', которые вы предоставляете в 'dictionaryWithObjectsAndKeys'.как предоставить динамические значения – Krunal

+0

Пожалуйста, проверьте мой отредактированный ответ – spaleja

+0

показывает несовместимое целое число, отправляющее int в id здесь 'NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys: atIndex, @" AtIndex ", arr, @" ImagesUrl ", nil];' – Krunal

0

Вы не можете использовать 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 может не хватить).

+0

откуда я могу назвать метод 'downloadImage3'? – Krunal

+0

NSInvocation делает это за вас, вызов -включить на NSInvocation вызовет метод, который вы ему даете. В этом случае это будет описанный вами способ загрузки. –