Используйте ASIHTTPRequest в качестве ключа NSDictionary

Я пытаюсь использовать ASIHTTPRequest/ASIFormDataRequest в качестве ключа в NSDictionary следующим образом:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:GPUserData.userlogin forKey:@"username"];
[request setPostValue:GPUserData.password forKey:@"password"];
[request setDelegate:self];
[_delegates setObject:delegate forKey:request];
[_selectors setObject:[NSValue valueWithPointer:selector] forKey:request];

[request startAsynchronous];

Но он не возвращает правильные данные (nils или случайные), когда я пытаюсь получить доступ к [_delegate objectForKey:request] из -requestFinished:, поэтому я использую в качестве временного решения:

[_delegates setObject:delegate forKey:[request url]];
[_selectors setObject:[NSValue valueWithPointer:selector] forKey:[request url]];

Но [request URL] не уникален для каждого отдельного запроса. Я знаю, что для того, чтобы что-то было жизнеспособным ключом, нужно, чтобы -hash и -isEqual: возвращали один и тот же результат, т.е. если объекты возвращают YES в -isEqual:, то они оба должны возвращать одно и то же из -hash.

Из ASIFormDataRequest : ASIHTTPRequest : NSOperation : NSObject я не вижу метода, который переопределяет -isEqual: или -hash из NSObject, а ASIHTTPRequest реализует протокол (NSCopying).

Так что дает? Почему я не могу использовать запрос в качестве ключа? Есть ли другой уникальный идентификатор для запроса, который я могу использовать?

Любая помощь приветствуется. Для полной справки: я пытаюсь реализовать двухуровневый обратный вызов, в котором класс WebServices анализирует данные о -requestFinished (и обрабатывает сетевые ошибки и повторные входы в систему), а затем выполняет еще один обратный вызов, поэтому только данные JSON отправляются как NSDictionary.


person Stephen Furlani    schedule 24.06.2011    source источник
comment
Вы уверены, что проблема именно в ключе? Что такое selector?   -  person jscs    schedule 24.06.2011
comment
@ Джош Касвелл, да, селектор @selector(methodOnDelegate:). Он отлично отображается и работает, когда я использую [request url]   -  person Stephen Furlani    schedule 24.06.2011


Ответы (1)


Можете ли вы вместо этого сохранить уникальное значение в request.tag или использовать словарь userinfo для хранения данных, которые вам нужно сохранить? например:

request.userInfo = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"value", @"key", nil];
person JosephH    schedule 24.06.2011
comment
ВОТ ЭТО ДА. Я не знал о userInfo. Спасибо!! Я чувствую себя глупо сейчас. - person Stephen Furlani; 24.06.2011