And*_*wSB 20 delegates objective-c nsurlconnection ios nsurlsession
我一直使用完成处理程序.随着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];
Run Code Online (Sandbox Code Playgroud)
现在我有一个completionHandler响应,我将如何切换到委托来管理响应和数据?我可以dataTask从这个代表中添加另一个吗?使用这个dataTask创建并放入会话的cookie ?
Vac*_*cca 41
如果要添加自定义委托类,则需要至少实现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);
}
Run Code Online (Sandbox Code Playgroud)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
Run Code Online (Sandbox Code Playgroud)
- (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
}
Run Code Online (Sandbox Code Playgroud)
如果要将委托代码(中间层)与调用类分开(通常是为网络调用分别具有单独的类/层),NSURLSession的委托必须是: -
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];
Run Code Online (Sandbox Code Playgroud)
参考链接:
| 归档时间: |
|
| 查看次数: |
26145 次 |
| 最近记录: |