iPhone:ASIHTTP setDidFinishSelector问题

iPhone:ASIHTTP setDidFinishSelector问题,iphone,selector,Iphone,Selector,我有以下代码: - (void)imageDownloaded:(ASIHTTPRequest *) request idPlace:(NSNumber *)idPlace NSData *responseData = [request responseData]; if (responseData == nil) { NSLog(@"bad"); } } 及 但它不起作用,因为responseData为null 我尝试过这种方法(使用一

我有以下代码:

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

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

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

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

你知道我该怎么做吗?由于带有两个参数的选择器不起作用,我无法找到问题的解决方案。

这一行是垃圾:

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

假设ASIHTTPRequest只接受格式为
foo:
(例如一个参数)的DidFinishSelector,那么就没有好的方法来完成您要做的事情,即在方法上附加第二个参数。那根本行不通。您有几个备选方案,但最简单的可能是使用ObjC关联对象。您可以将您的
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);
这行是垃圾:

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

假设ASIHTTPRequest只接受格式为
foo:
(例如一个参数)的DidFinishSelector,那么就没有好的方法来完成您要做的事情,即在方法上附加第二个参数。那根本行不通。您有几个备选方案,但最简单的可能是使用ObjC关联对象。您可以将您的
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);
你可以用

[request setTag:place.idPlace]
设置地点ID 及

要将其下载到图像中,您可以使用

[request setTag:place.idPlace]
设置地点ID 及


要在您的imageDownloaded中获得它

最后,我覆盖了ASIHTTPRequest,以便添加带有idPlace的属性。但我也试过了你的答案,效果很好。非常感谢您,我想您也可以将ASIHTTPRequest子类化以添加您自己的属性。ASIHTTPRequest有一个用户信息字典属性,您可以将内容附加到该属性。您不需要实际使用关联的对象或子类。最后,为了添加带有idPlace的属性,我重写了ASIHTTPRequest。但我也试过了你的答案,效果很好。非常感谢您,我想您也可以将ASIHTTPRequest子类化以添加您自己的属性。ASIHTTPRequest有一个用户信息字典属性,您可以将内容附加到该属性。您不需要实际使用关联的对象或子类。