iPhone:ASIHTTP setDidFinishSelector问题

时间:2011-02-01 00:47:16

标签: iphone selector

我有以下代码:

  - (void)imageDownloaded:(ASIHTTPRequest *) request idPlace:(NSNumber *)idPlace
        NSData *responseData = [request responseData];
    if (responseData == nil) {
        NSLog(@"bad");
    }
  }

   NSURL *url = [NSURL URLWithString:[item objectForKey:@"image"]];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:[self performSelector:@selector(imageDownloaded:idPlace:)withObject:request withObject:place.idPlace]];

但它不起作用,因为responseData为null。

我尝试过这种方式(只有一个参数的选择器):

[request setDidFinishSelector:@selector(imageDownloaded:)];


- (void)imageDownloaded:(ASIHTTPRequest *) request

这很有效。但我需要知道idPlace,以便使用相应的名称保存图像,以便稍后获取图像。

我对如何做到这一点有任何想法?由于带有两个参数的选择器不起作用,我找不到我的问题的解决方案。

2 个答案:

答案 0 :(得分:2)

这一行是垃圾:

[request setDidFinishSelector:[self performSelector:@selector(imageDownloaded:idPlace:)withObject:request withObject:place.idPlace]];

这至少应该抛出一个编译器警告。您正在立即执行-imageDownloaded:idPlace:,然后获取结果(在您的情况下将是堆栈中的任何垃圾值)并将其作为选择器返回。响应数据为零,因为您实际上在请求运行之前执行了imageDownloaded:方法。

假设ASIHTTPRequest只接受foo:形式的didFinishSelectors(例如一个参数),那么没有好办法做你想要做的事情,即将第二个参数附加到方法上。这根本行不通。你有几个选择,但最简单的可能是使用ObjC Associated Objects。您可以将place.idPlace对象悬挂在请求之外,稍后再进行操作。

在文件顶部,定义一个键:

static char kAssociationKey; // we just want its memory location

然后当您启动请求时,您可以运行:

objc_setAssociatedObject(request, &kAssociationKey, place.idPlace, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[request setDidFinishSelector:@selector(imageDownloaded:)];

这会将place.idPlace附加到请求对象。然后在你的didFinishSelector中你可以运行

id oldIdPlace = objc_getAssociatedObject(request, &kAssociationKey);

答案 1 :(得分:1)

您可以使用

[request setTag:place.idPlace]

设置地方ID 和

[request tag]

在你的imageDownloaded中获取它