2017-01-20 2 views
1

я имел IOS рамки, которые он отправить JSON к серверу, используя NSURLSessionDataTask так:IOS 9: Получение значения из NSURLSessionDataTask В Framework

NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
    int responseStatusCode = [httpResponse statusCode]; 

    if (responseStatusCode == 200) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.delegate onJsonHttpResult:data andStatusResponse:responseStatusCode]; 
}); 
    } 
    else 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.delegate onJsonHttpResult:nil andStatusResponse:responseStatusCode]; 
}); 
    } 

}]; 

[postDataTask resume]; 

, но всякий раз, когда я запускаю его, [self.delegate onJsonHttpResult:nil andStatusResponse:responseStatusCode]; не называется.

Есть ли способ получить стоимость за пределами NSURLSessionDataTask, когда он работает внутри рамки?

Благодаря

+0

Какое значение вы получаете от 'responseStatusCode'? –

+0

Привет, Piyush Patel, responseStatusCode значение, например, 200 или 404 – victorz

+0

Пробовал ли после этого код сразу после responseStatusCode без if ... else ... condition? –

ответ

0

Спасибо за помощь, но мне еще нужно делегировать вернуть свою ценность вне рамок.

У меня получилось, что всякий раз, когда я делал это с NSURLSessionDataTask, делегат стал нулевым, я думаю, что это вызвало освобождение делегата после того, как я получил ответ от NSURLSessionDataTask. Поэтому я попытался изменить делегат @property на сильный и он работает. Я могу снова вернуть свою ценность, используя делегат. Спасибо

0

Мое предложение заключается в создании и использовании APIHelperClass с completionBlock. Это будет более простым и аффективным, чем использование пользовательского Delegate согласно моему представлению.

Чтобы создать его, вы можете сделать следующим образом:

В APIHelperClass.h

#import <Foundation/Foundation.h> 

@interface APIHelperClass : NSObject 

+(void)apiCallSharedSessionPOST:(NSURLRequest *)request withCompletionHandlar:(void (^) (NSDictionary *dicResult,NSError *error, int status))completionBlock; 


@end 

И

APIHelperClass.m

#import "APIHelperClass.h" 

@implementation APIHelperClass 


+(void)apiCallSharedSessionPOST:(NSURLRequest *)request withCompletionHandlar:(void (^) (NSDictionary *dicResult,NSError *error, int status))completionBlock; 

     NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
     NSURLSession *session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; 

     NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
               completionHandler: 
             ^(NSData *data, NSURLResponse *response, NSError *error) { 

              NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
              int responseStatusCode = (int)[httpResponse statusCode]; 

              if (error!=nil) 
              { 
               completionBlock(nil,error,responseStatusCode); 
               [task suspend]; 
              } 
              else 
              { 
               NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; 
               completionBlock(dic,error,responseStatusCode); 
               [task suspend]; 
              } 
             }]; 
     [task resume]; 

} 

Затем вы можете использовать этот класс для всего приложения и вы не нужно создавать пользовательские Delegates всегда.

Затем используйте что там, где вы хотите, как:

NSURLRequest *request; 
    /* 
    Configure your Request Here 
    */ 

[APIHelperClass apiCallSharedSessionPOST:request withCompletionHandlar:^(NSDictionary *dicResult, NSError *error, int status) { 

}]; 
+0

Привет, Piyush Patel, Спасибо за помощь, но мне все еще нужен делегат, чтобы вернуть мою ценность вне рамки. Я получил, что всякий раз, когда я делал это с NSURLSessionDataTask, делегат стал нулевым, я думаю, что это вызвало освобождение делегата после того, как я получил ответ от NSURLSessionDataTask. Поэтому я попытался изменить делегат @property на сильный и он работает. Я могу вернуть свою ценность, используя делегат. Спасибо – victorz

Смежные вопросы