3 回答
TA贡献1860条经验 获得超9个赞
我跟踪由与之关联的NSURLConnection键入的CFMutableDictionaryRef中的响应。即:
connectionToInfoMapping =
CFDictionaryCreateMutable(
kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
使用它而不是NSMutableDictionary可能看起来很奇怪,但我这样做是因为这个CFDictionary只保留其键(NSURLConnection),而NSDictionary复制其键(并且NSURLConnection不支持复制)。
一旦完成:
CFDictionaryAddValue(
connectionToInfoMapping,
connection,
[NSMutableDictionary
dictionaryWithObject:[NSMutableData data]
forKey:@"receivedData"]);
现在我有一个“info”字典,用于每个连接,我可以用它来跟踪有关连接的信息,“info”字典已经包含一个可变数据对象,我可以用它来存储答复数据。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSMutableDictionary *connectionInfo =
CFDictionaryGetValue(connectionToInfoMapping, connection);
[[connectionInfo objectForKey:@"receivedData"] appendData:data];
}
TA贡献1784条经验 获得超7个赞
我有一个项目,我有两个不同的NSURLConnections,并希望使用相同的委托。我所做的是在我的类中创建两个属性,每个连接一个。然后在委托方法中,我检查它是否是哪个连接
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
if (connection == self.savingConnection) {
[self.savingReturnedData appendData:data];
}
else {
[self.sharingReturnedData appendData:data];
}
}
这也允许我在需要时按名称取消特定连接。
TA贡献2051条经验 获得超10个赞
对NSURLConnection进行子类化以保存数据是干净的,代码少于其他一些答案,更灵活,并且需要较少考虑参考管理。
// DataURLConnection.h
#import <Foundation/Foundation.h>
@interface DataURLConnection : NSURLConnection
@property(nonatomic, strong) NSMutableData *data;
@end
// DataURLConnection.m
#import "DataURLConnection.h"
@implementation DataURLConnection
@synthesize data;
@end
像使用NSURLConnection一样使用它并在其data属性中累积数据:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
((DataURLConnection *)connection).data = [[NSMutableData alloc] init];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[((DataURLConnection *)connection).data appendData:data];
}
而已。
如果你想更进一步,可以添加一个块作为回调,只需几行代码:
// Add to DataURLConnection.h/.m
@property(nonatomic, copy) void (^onComplete)();
像这样设置:
DataURLConnection *con = [[DataURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
con.onComplete = ^{
[self myMethod:con];
};
[con start];
并在加载完成时调用它,如下所示:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
((DataURLConnection *)connection).onComplete();
}
您可以扩展块以接受参数,或者只将DataURLConnection作为参数传递给no-args块中需要它的方法
- 3 回答
- 0 关注
- 439 浏览
添加回答
举报