【发布时间】:2011-06-15 21:31:58
【问题描述】:
我有自己的方法,将块作为参数。我想跟踪 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分:
- 块是 objc 对象
- 错字: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协议,因此不能成为字典的有效键。 -
为什么说
setObject应该是setValue?-setObject:forKey:是NSMutableDictionary中用于将对象存储到字典中的规范方法,如果使用此方法,键不需要是字符串。正如 Deepak 所说,它需要符合NSCopying协议。
标签: ios nsdictionary objective-c-blocks grand-central-dispatch