У меня есть собственный метод, который принимает блок в качестве аргумента. Я хочу отслеживать этот блок внутри NSDictionary. Как лучше всего добавить блок в словарь?
Я попробовал этот код, но после выполнения строки ниже (setObject...) словарь все еще пуст. Я предполагаю, что это потому, что блок не имеет типа NSObject. Но как правильно это сделать?
- (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[pendingRequests setObject:handler forKey:connection];
}
РЕДАКТИРОВАТЬ:
Не бери в голову. Я не знаю, о чем я думал. 3 балла:
- Блоки являются объектными объектами
- Опечатка: setObject должен быть setValue
- forKey — это строка, поэтому она должна быть [описание соединения] или что-то в этом роде.
Во всяком случае, теперь я исправил свою проблему следующим образом:
- (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[pendingRequests setValue:handler forKey:[connection description]];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
void (^handler)(NSURLResponse*, NSData*, NSError*);
handler = [pendingRequests valueForKey:[connection description]];
handler(nil, nil, nil);
});
}
NSURLConnection
не соответствует протоколуNSCopying
и, следовательно, не может быть допустимым ключом для словаря. - person Deepak Danduprolu   schedule 16.06.2011setObject
должно бытьsetValue
?-setObject:forKey:
— это канонический метод вNSMutableDictionary
для хранения объектов в словаре, и ключ не обязательно должен быть строкой, если вы используете этот метод. Как сказал Дипак, он должен соответствовать протоколуNSCopying
. - person   schedule 16.06.2011