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 關注
- 472 瀏覽
添加回答
舉報