2011-02-01 2 views
0

У меня есть следующий код:iPhone: ASIHTTP setDidFinishSelector вопрос

- (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 равна нулю.

Я попробовал этот путь (с селектором только один аргумент):

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


- (void)imageDownloaded:(ASIHTTPRequest *) request 

И это работает. Но мне нужно знать idPlace, чтобы сохранить изображение с соответствующим именем, чтобы получить изображение позже.

Любая идея о том, как я могу это сделать? Поскольку селектор с двумя аргументами не работает, я не могу найти решение моего вопроса.

ответ

2

Эта линия мусора:

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

Это должно бросать предупреждение компилятора, по крайней мере. Вы немедленно выполняете -imageDownloaded:idPlace:, а затем берете результат (который в вашем случае будет тем, что значение мусора было в стеке) и возвращает его как селектор. данные ответа равны нулю, потому что вы фактически выполняете свой метод imageDownloaded: до того, как запрос даже запустится.

Предполагая, что ASIHTTPRequest принимает только didFinishSelectors формы foo: (например, один аргумент), тогда нет хорошего способа сделать то, что вы пытаетесь сделать, а именно приложить второй аргумент к методу. Это просто не сработает. У вас есть несколько альтернатив, но самый простой - это, вероятно, использование 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); 
+0

наконец я переопределить ASIHTTPRequest, чтобы добавить свойство с idPlace. Но также я попробовал ваш ответ, и он работает. Так что спасибо вам большое – xger86x

+0

Предположим, вы также можете просто подклассифицировать ASIHTTPRequest, чтобы добавить свою собственную собственность. –

+0

ASIHTTPRequest имеет свойство словаря пользовательской информации, к которому вы можете прикрепить материал. Вам не нужно фактически использовать связанные объекты или подкласс. – Ashemah

1

Вы можете использовать

[request setTag:place.idPlace] 

установить Place ID и

[request tag] 

, чтобы получить его в imageDownloaded

Смежные вопросы