2016-07-04 1 views
0

하나는 다음과 같습니다공통 API 요청 처리기 내 응용 프로그램에서 요청

-(void)login 
{ 
    @try { 
     NSString *str = [NSString stringWithFormat:TGURL_LOGIN]; 
     NSURL *url = [NSURL URLWithString:str]; 
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
     NSDictionary *requestData = @{@"---": ----, 
             @"---": ----, 
             @"OutResponse": [NSNumber numberWithInteger:0]}; 

     NSError *error; 
     NSData *postData = [NSJSONSerialization dataWithJSONObject: requestData options:0 error:&error]; 

     NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]]; 


     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
     [request setURL:url]; 
     [request setHTTPMethod:@"POST"]; 
     [request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
     [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
     [request setHTTPBody:postData]; 

     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
     __block int iSuccess = 0; 

     [NSURLConnection 
     sendAsynchronousRequest:request 
     queue:queue 
     completionHandler:^(NSURLResponse *response, 
          NSData *data, 
          NSError *error) { 
      [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
      if ([data length] >0 && error == nil){ 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        iSuccess = [self parseResponse:data]; 
       }); 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        if(iSuccess == 1) 
        { 
         [[NSUserDefaults standardUserDefaults] setObject:_email.text forKey:@"EmailText"]; 
         [[NSUserDefaults standardUserDefaults] setObject:_password.text forKey:@"PasswordText"]; 
         [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"User_Logged_In"]; 
         [[NSUserDefaults standardUserDefaults]synchronize]; 

         [TGProjectHandler saveCookiesToDefaults]; 
         [self getUserID]; 
        } 
        else if(iSuccess == 3) 
        { 
         [[NSUserDefaults standardUserDefaults] setObject:_email.text forKey:@"EmailText"]; 
         [[NSUserDefaults standardUserDefaults] setObject:_password.text forKey:@"PasswordText"]; 
         [[NSUserDefaults standardUserDefaults]synchronize]; 
         [self.view endEditing:YES]; 
         [TGProjectHandler saveCookiesToDefaults]; 
         [TGProjectHandler removeLoadingIndicator]; 
         [self performSegueWithIdentifier:@"ShowJoinGroup" sender:nil]; 
        } 
        else 
        { 
         [[[UIAlertView alloc] initWithTitle: NSLocalizedString(@"Login_failed", nil) 
                message:NSLocalizedString(@"Invalid_credentials", nil) 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil] show]; 
         [TGProjectHandler removeLoadingIndicator]; 
         self.view.userInteractionEnabled = YES; 
        } 
       }); 
      } 
      else if ([data length] == 0 && error == nil){ 
       NSLog(@"Empty Response, not sure why?"); 
      } 
      else if (error != nil){ 
       NSLog(@"%@", error.description); 
       self.view.userInteractionEnabled = YES; 
       [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Login_failed", nil) 
              message:error.localizedDescription 
              delegate:nil 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil] show]; 
       [TGProjectHandler removeLoadingIndicator]; 
       self.view.userInteractionEnabled = YES; 
      } 
     }]; 
    } 
    @catch (NSException *exception) { 
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
    } 
} 

이 바로 서비스 호출 중 하나입니다. 백 가지를 가져라. 현재 나는 컨트롤러 자체에 이것을 쓰고있다. (나쁜 접근법, 나는 알고있다. :)).
하나의 클래스에서 모든 요청 기반 코드를 작성하고 어디서나 액세스 할 수있는 방법을 찾고 있습니다.
잠시 동안 나는 싱글 톤을 만들 생각을했습니다. 그러나 이것에 대한 싱글 톤을 만드는 것에 대해서는 확실하지 않습니다.
또한 프로토콜을 만드는 방법에 대해 생각해 보았지만 마침내 컨트롤러에서 구현해야했습니다.
내가 갈 수있는 다양한 패턴이 무엇인지, 그래서 내가 어디에서나 반복되는 코드에 대한 공통 클래스를 갖게되었습니다.

+1

당신은 NSObject의 클래스를 만드는 시도 할 수 있습니다, 당신은 당신의 websersevice 게시물을 선언하고 방법을 얻을 수있는 곳. 해당 webservice 클래스에 webservice 이름과 매개 변수를 전달하고 데이터가 필요한 클래스에서 응답을 받아야합니다. 웹 서비스 응답을위한 완료 핸들러를 만들 수 있습니다. –

+0

@RahulPatel : 완료 핸들러를 처리하는 방법? – Nitish

답변

1

이 같은 짓을, 내가 유틸리티 클래스를 만든

이 내가 만든

다음
#import <Foundation/Foundation.h> 

typedef void (^webCompletionHandler)(NSData *data); 
typedef void (^webFailuerHandler)(NSError *error); 


@interface WebService : NSObject 



-(BOOL)callPostWebService:(NSString *)methodURL 
        param:(NSMutableDictionary *)params 
     completionHandler:(webCompletionHandler)completion 
      failuerHandler:(webFailuerHandler)failuer; 


-(BOOL)callgetWebService:(NSString *)methodURL 
     completionHandler:(webCompletionHandler)completion 
      failuerHandler:(webFailuerHandler)failuer; 



@end 

내 webservice.h 파일 두 개의 핸들러 실패

에 대한 완료, 다른 하나

및이 두 가지 방법은 PostGet

-(void)getWebServiceCall:(NSString *)methodURL 
       parameters:(NSMutableDictionary *)parameters 
     completionHandler:(webCompletionHandler)completion 
      faliureHandler:(webFailureHandler)failure; 

-(void)postWebserviceCall:(NSString *)methodURL 
        param:(NSMutableDictionary *)params 
     completionHandler:(webCompletionHandler)completion 
      faliureHandler:(webFailureHandler)failure; 

이것은 당신이 웹 서비스를 호출 할 필요가 이제까지 당신은 단지 당신이 urlparameters

[webService postWebserviceCall:strURL param:dicInfo completionHandler:^(id data) { 

    } faliureHandler:^(NSError *error) { 

    }]; 
를 전달하여 필요 쪽 포스트 및 GTE 메소드를 호출 할 수 있습니다 내가 그런
-(void)callPostWebService:(NSString *)methodURL 
        param:(NSMutableDictionary *)params 
     completionHandler:(webCompletionHandler)completion 
      failuerHandler:(webFailuerHandler)failuer{ 

    if(![Utility isReachable]){ 
     DisplayLocalizedAlert(@"Network is not reachable"); 
     return; 
    } 


    NSLog(@"%@",methodURL); 
    NSURLRequest *request = [self createRequest:params url:methodURL]; 

    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *dataTask = 
    [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 


     dispatch_async(dispatch_get_main_queue(), ^{ 
      if(error != nil){ 
       failuer(error); 
       return ; 
      } 
      else{ 

       NSError* error; 
       NSDictionary* json = [NSJSONSerialization 
             JSONObjectWithData:data 
             options:kNilOptions 
             error:&error]; 
       NSLog(@"json %@",json); 

       completion(data); 
      } 
     }); 
    }]; 
    [dataTask resume]; 

    return true; 
} 

를 사용한 포스트 방법이다 스위프트에서

:

import UIKit 
import MobileCoreServices 
import CoreLocation 


typealias webCompletionHandler = (data : NSData) -> Void; 
typealias webFailuerHandler = (error : NSError,isCustomError : Bool) -> Void; 


let failureStatusCode = 0; 
let successStatusCode = 200; 

class WebServiceCall :NSObject { 

    static var webService = WebServiceCall(); 

    override init() { 

    } 

func callPostWebService(methodURL methodURL :String, param:NSDictionary, completionHandler:webCompletionHandler, failureHandler: webFailuerHandler) -> Bool 
    { 
     if (isInternetHasConnectivity() == false) { 
      let myError = NSError(domain: "Internet is not available", code: 1001, userInfo: nil) 
      failureHandler(error: myError, isCustomError: true); 
//   AlertView.showMessageAlert(myError.domain) 
      return false; 
     } 

     let request = self.createRequest(param, strURL: methodURL) 

     let serviceTask = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { 
      data, response, error in 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       if(error != nil){ 

        failureHandler(error: error!, isCustomError: false); 
       } 
       else{ 

        let response = Utilities.parseData(data!) 
        let status = response.objectForKey("status") as! Int; 

        if(status == successStatusCode){ 
         completionHandler(data: data!) 
        } 
        else { 
         let msg = response.objectForKey("message") as! String 
         let error = NSError(domain: msg, code: Int(status), userInfo: nil); 
         failureHandler(error: error, isCustomError: true); 
        } 

       } 

      }) 
     }) 
     serviceTask.resume(); 

     return true; 
    } 
} 
+0

webCompletionHandler와 webFailureHandler는 어떻게 그리고 어디에서 정의 했습니까? – Nitish

+0

감사합니다. 수락하기 전에 이것을 시험해 보겠습니다 :) – Nitish

+0

신속하게이 코드를 변환하는 데 어려움이 있습니다. 당신은 이것의 신속한 버전이 있습니까? 그렇지 않으면 나는 이것을위한 객관적인 수업을 만들 것이다. – Nitish

0
  1. 모든 요청에 ​​대한 논리를 처리 할 WebService를 만듭니다.
  2. 각 요청에서 반복되는 추출 코드.
  3. UI 관련 코드를 WebService에서 UIViewController 클래스로 이동하십시오.

기본적으로 UIViewController은 요청 생성에 대해 아무것도 모르는 경우에만 WebService를 호출 한 다음 결과를 처리합니다.

0

AFNetworking 프로세스를 사용하여 API를 호출 해 볼 수 있습니다. 여기서 우리는 하나의 viewController에 호출을 작성할 수 있으며 해당 VC를 가져올 수 있으므로 필요할 때마다 API를 호출 할 수 있습니다.