2016-05-16 3 views
2

я хочу получить ответ сервера от NSObject, когда я получаю ответ, он должен вернуться к viewController.as я реализовать на сервере вызова в NSObject класс, то я назвал методу NSObject, но до ответа сервера моего NSString уже было вернуться в null.Как настроить NSURLSessionConfiguration в класс NSObject?

NSObject class : 

    @interface getServerCallClassMethod : 
    NSObject<NSURLSessionDelegate> 
{ 
     NSString *ResponceStr; 
} 
-(NSString *)getServerCall:(NSString *)mobleNo serverUrl:(NSString *)url; 

    @end 

реализовать часть:

@implementation getServerCallClassMethod

-(NSString *)getServerCall:(NSString *)mobleNo serverUrl:(NSString *)url{  

NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration]; 
     NSURLSession *urlSession=[NSURLSession 
     sessionWithConfiguration:sessionConfig delegate:self 
     delegateQueue:[NSOperationQueue mainQueue]]; 
    NSURL *servrurl=[NSURL URLWithString:GetOTP]; 
    NSURLSessionDataTask *dataTask=[urlSession 
     dataTaskWithURL:servrurl completionHandler:^(NSData * _Nullable data, 
     NSURLResponse * _Nullable response, NSError * _Nullable 
     connectionError) 
     { if (data.length > 0 && connectionError == nil){ 
      [email protected]"success"; } else{ [email protected]"fail"; 
     } 
     }]; 
     [dataTask resume]; 
    }); 
      return ResponceStr; 
    } 
    In Vc : 
    getServerCallClassMethod *GetServerCallMethod=[[getServerCallClassMethod alloc]init]; 

    NSString *valide=[GetServerCallMethod getServerCall:@"800000000" serverUrl:@"http://www.gg.com"]; NSLog(@"valide"); 
+0

, если вы хотите получить ответ сервера, попробуйте это [link] (http://stackoverflow.com/a/37086586/4003548) – vaibhav

+0

, но я хочу, как получить из класса NSObject, потому что я не хочу переопределять как один и тот же код ко всем place .if Я написал один метод NSObject-сервера, тогда я хочу вызвать метод сервера из любого класса. –

ответ

1

Попробуйте это:

В файле интерфейса

@interface APISession : NSURLSession <NSURLSessionDownloadDelegate,NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionTaskDelegate> 

+(void)apiCallSharedSessionGet:(NSString *)strURL withCompletionHandlar:(void (^) (NSString *response, NSError *error, int status)) completionBlock; 

В файле реализации

@implementation APISession 



+(void)apiCallSharedSessionGet:(NSString *)strURL withCompletionHandlar:(void (^) (NSString *response, NSError *error, int status)) completionBlock 
{ 


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strURL]]; 
    [request setHTTPMethod:@"GET"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    __block NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
     if (error!=nil) 
     { 
      completionBlock(nil,error,0); 
      [task suspend]; 
     } 
     else 
     { 
      NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
      NSLog(@"requestReply: %@", requestReply); 
      completionBlock(requestReply,error,1); 
      [task suspend]; 
     } 

    }]; 
[task resume]; 

} 
+0

Действительно спасибо: Piyush Пател –

+0

Я решил свои проблемы –

+0

@Tamil_Arya wc ... :) –

0

Если вы хотите получить ответ от NSURLSessionDataTask до старта приема данных, не первоначальный NSURLSessionDataTask с dataTaskWithURL: completionHandler. Вы должны выполнить задачу данных с помощью dataTaskWithURL и обработать делегат вместо этого.

NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *urlSession=[NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 
NSURL *servrurl=[NSURL URLWithString:GetOTP]; 
NSURLSessionDataTask *dataTask=[urlSession dataTaskWithURL:servrurl]; 

Вы должны добавить соответствовать NSURLSessionDataDelegate в файле делегата.

В вашей реализации делегата:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { 
    NSLog(@"Response: %@", response); 
    completionHandler(NSURLSessionResponseAllow); // Allow to continue this request 
} 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 
    NSLog(@"Receive data"); 
} 

Обратите внимание, что вы должны реализовать второй способ делегирования правильно получить полные данные вашего запроса, так как данные не будут получены сразу.

Для получения более подробной информации, обратитесь к этому документу: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionDataDelegate_protocol/index.html#//apple_ref/occ/intfm/NSURLSessionDataDelegate/URLSession:dataTask:didReceiveData:

+0

Tien: я реализовал то, что я указал, как правильно получить ответ, но как передать этот ответ успеха viewController из класса NSObject –