私は常に補完ハンドラーを使用してきました。 NSURLConnection
あり、現在はNSURLSession
付き。それは私のコードが本当に乱雑になることにつながりました、特に私はリクエスト内のリクエスト内にリクエストがあります。
NSURLSession
でデリゲートを使用して、NSURLConnection
で整然と実行したことを実装したいと思いました。
そこで、NSURLSession
を作成し、dataTask
を作成しました。
NSURLSessionDataTask *dataTask = [overallSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil)
{
NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Data = %@",text);
}
}];
[dataTask resume];
現在、応答用のcompletionHandler
がありますが、応答とデータを管理するためにデリゲートにどのように切り替えますか?そして、このデリゲートから別のdataTask
を追加できますか?このdataTask
が作成してセッションに配置したCookieを使用しますか?
カスタムデリゲートクラスを追加する場合は、少なくともNSURLSessionDataDelegate
およびNSURLSessionTaskDelegate
プロトコルを実装する必要があります。
メソッドで:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
receivedData=nil; receivedData=[[NSMutableData alloc] init];
[receivedData setLength:0];
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
if (error) {
// Handle error
}
else {
NSDictionary* response=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&tempError];
// perform operations for the NSDictionary response
}
デリゲートコード(中間層)を呼び出しクラスから分離したい場合(通常、ネットワーク呼び出し用に別のクラス/レイヤーを用意することをお勧めします)、NSURLSessionのデリゲートは次のようにする必要があります。
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];
参照リンク: