我有以下代码:
- (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,以便使用相应的名称保存图像,以便稍后获取图像。
我对如何做到这一点有任何想法?由于带有两个参数的选择器不起作用,我找不到我的问题的解决方案。
答案 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中获取它