2016-12-14 6 views
1

Я использую NSURLSession для разбора JSON. Я пишу такой код, но методы делегата не вызываются при запуске приложения. i.e connectionDidFinishLoading и didReceiveData методов. Как позвонить NSURLSessionDelegate методов?NSURLSessionDelegate connectionDidFinishLoading метод не называется

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    menuArr = [[NSMutableArray alloc]init]; 

    self.view.backgroundColor = [UIColor whiteColor]; 

    NSURL *url =[NSURL URLWithString:@"http://url"]; 

    dataTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) 
    { 
     if(error == nil) 
     { 
      NSError *JSONError = nil; 

      NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&JSONError]; 

      NSLog(@"Dictionary is:%@",dictionary); 
     } 
    }]; 

    [dataTask resume]; 
} 

#pragma mark - NSURLSession delegate methods 

- (BOOL)URLSession:(NSURLSession *)session dataTask:(NSURLSessionTask *)dataTask canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace*)protectionSpace 
{ 
    BOOL isvalue = [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 

    return isvalue; 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition,NSURLCredential *credential))completionHandler 
{ 
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse 
{ 
    receivedData = [[NSMutableData alloc]init]; 
    [receivedData setLength:0]; 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
{ 
    NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    NSLog(@"Received String %@",str); 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionTask *)dataTask connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    NSError *error; 

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error]; 

    NSString *str=[dict objectForKey:@"Status"]; 

    NSLog(@"Status Response is:%@",str); 

    NSDictionary *jsonDict = [dict valueForKey:@"data"]; 

    NSLog(@"Json Dictionary is:%@",jsonDict); 

    menuArr = [jsonDict valueForKey:@"Text"]; 

    NSLog(@"Item Name is:%@",menuArr); 
} 
+0

Добавить отформатированный код, так что каждый сможет прочитать код – Rajat

+0

http://stackoverflow.com/ a/39203067/3400991 возможный дубликат –

ответ

-1

Вы должны написать методы делегатов рядом с определением класса; Пример:
@interface MyControllerClass: UIViewController UIAlertViewDelegate в <>

+0

да, я пишу вот так .. но получаю такую ​​же проблему. – Surya

+0

Вы определили делегата в h-файле? –

+0

Да, я определяю файл .h – Surya

0

Вы используете общий сеанс. Это уже существовавшая сессия, у которой нет делегата. Если вы хотите, чтобы ваши задачи вызывать методы делегата, вы должны:

  • Создайте свой собственный сеанс
  • Укажите объект, который вы хотите использовать в качестве делегата при создании этой сессии
  • Создание задачи в том, что а не общий сеанс.
0
  • Добавить Два делегата NSURLSessionDelegate, NSURLSessionDataDelegate

    -(void)viewDidLoad { 
        [super viewDidLoad]; 
    
        [self sendHTTPPost]; 
    
    } 
    -(void) sendHTTPPost 
    { 
        NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
        NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]]; 
    
        NSURL * url = [NSURL URLWithString:@"http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo"]; 
        NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; 
    
        [urlRequest setHTTPMethod:@"POST"]; 
    
        NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:urlRequest]; 
        [dataTask resume]; 
    
    } 
    
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
    didReceiveResponse:(NSURLResponse *)response 
    completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
    { 
        NSLog(@"### handler 1"); 
    
        completionHandler(NSURLSessionResponseAllow); 
    } 
    
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
    { 
        NSError *error; 
    
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
    
        NSLog(@" dict=>> %@",dict); 
    
    } 
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 
    { 
        if(error == nil) 
        { 
         NSLog(@"Download is Succesfull"); 
        } 
        else 
         NSLog(@"Error %@",[error userInfo]); 
    }