1

我想在后台调用这个方法,

-(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:在后台调用方法?

我在哪里做错了?

4

3 回答 3

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
}
于 2013-11-08T08:02:37.050 回答
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
}
于 2013-11-08T08:20:06.570 回答
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 可能不够用)。

于 2013-11-08T08:58:12.443 回答