iPhone: ASIHTTP setDidFinishSelector проблема - PullRequest
0 голосов
/ 01 февраля 2011

У меня есть следующий код:

  - (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 ]

2 голосов
/ 01 февраля 2011

Эта строка мусора:

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

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

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

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

[request setTag:place.idPlace]

, чтобы установить идентификатор места, и

[request tag]

, чтобы получить его в своем изображении.

...