how - rest swift ios
NSURLSession delegate vs. completionHandler (1)
Si desea agregar una clase de delegado personalizada, debe implementar los protocolos NSURLSessionDataDelegate
y NSURLSessionTaskDelegate
como mínimo.
Con los métodos:
NSURLSessionDataDelegate: obtenga un estado continuo de su solicitud
- (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);
}
NSURLSessionDataDelegate
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
NSURLSessionTaskDelegate
- (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
}
Si desea separar el código de delegado (capa intermedia) de su clase de llamada (generalmente es una buena práctica tener una clase / capa separada para las llamadas de red), el delegado de NSURLSession debe ser: -
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:myCustomDelegateClass delegateQueue:nil];
Ref Links:
Siempre he usado controladores de finalización. Con NSURLConnection
y ahora con NSURLSession
. Ha llevado a que mi código sea realmente desordenado, especialmente solicito a pedido.
Quise probar el uso de delegados en NSURLSession
para implementar algo que he hecho NSURLConnection
con NSURLConnection
.
Así que creé una NSURLSession
y creé una 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];
En este momento tengo un completionHandler
de completionHandler
para la respuesta, ¿cómo cambiaría a los delegados para gestionar la respuesta y los datos? ¿Y puedo agregar otra dataTask
del delegado de esta? ¿Usando las cookies que este dataTask
creó y colocó en la sesión?