AFN 프레임 사용 정리

1. AFN 프레임 기본 사용
  • 1 AFN 내부 구조 AFN 구조 체
  • NSURLConnection (iOS 9.0 폐기)
  • AFURLConnectionOperation
  • AFHTTPRequestOperation
  • AFHTTPRequestOperationManager (자주 사용 하 는 HTTP 방법 을 봉 인 했 습 니 다)
  • 속성
  • baseURL: AFN 은 개발 자가 AFHTTPRequest OperationManager 에 대해 하나의 예 류 를 사용자 정의 하고 baseURL 을 설정 하 며 모든 네트워크 접근 은 상대 적 인 경로 만 사용 하면 됩 니 다
  • requestSerializer: 요청 데이터 형식 / 기본 값 은 바 이 너 리 HTTP
  • response Serializer: 응답 하 는 데이터 형식 / 기본 값 은 JSON 형식
  • operationQueue
  • reachability Manager: 네트워크 연결 관리자
  • 방법
  • manager: 관리 자 를 만 드 는 데 편리 한 방법
  • HTTP Request Operation With Request: 서버 에 접근 할 때 추가 정 보 를 알려 주 려 면 Request 에 설정 해 야 합 니 다
  • GET
  • POST



  • NSURLSession
  • AFURLSessionManager
  • AFHTTPSessionManager (자주 사용 하 는 HTTP 방법 을 봉 인 했 습 니 다)
  • GET
  • POST
  • UIKit + AFNetworking 분류
  • NSProgress: KVO 활용

  • 반자동 직렬 화 & 반 직렬 화 기능
  • AFURLRequestSerialization: 요청 한 데이터 형식 / 기본 값 은 바 이 너 리
  • AFURLResponse Serialization: 응답 하 는 데이터 형식 / 기본 값 은 JSON 형식
  • 추가 기능
  • 안전 전략
  • HTTPS
  • AFSecurityPolicy

  • 네트워크 검색
  • 애플 의 네트워크 연결 검 사 를 봉인 했다
  • AFNetworkReachabilityManager




  • Point Advice: AFN 이 UIKit 에 대한 분 류 를 배 워 서 자신의 능력 향상 에 도움 이 됩 니 다.
  • 2 AFN 의 기본 사용 (1) GET 요청 을 보 내 는 두 가지 방식 (POST 동일)
  •  -(void)get1 {
        //1.  AFHTTPRequestOperationManager   
        //AFHTTPRequestOperationManager     NSURLConnection   
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
        //2.    
        /*
         http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
              :NSString       ,AFN              url       
              :    ,        ,AFN        POST    GET  ,            NSData        
              :        Block
              :      Block
         */
    
        NSDictionary *param = @{
                                @"username":@"",
                                @"pwd":@""
                                };
    
        //  :          
        [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    
            NSLog(@"    ---%@",responseObject);
    
        } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
                NSLog(@"  ---%@",error);
        }];
    }
    
    -(void)get2 {
        //1.  AFHTTPSessionManager   
        //AFHTTPSessionManager     NSURLSession   
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //2.    
        NSDictionary *param = @{
                                @"username":@"",
                                @"pwd":@""
                                };
    
        //  :responseObject:           (AFN           OC  ,        )
        [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                NSLog(@"    ---%@",[responseObject class]);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"  ---%@",error);
        }];
    }
    

    (2) AFN 으로 파일 다운로드
    -(void)download {
        //1.       
        AFHTTPSessionManager *manage  = [AFHTTPSessionManager manager];
    
        //2.    
        /*
              :    
              :    
              :block  ,      url  ,    AFN         
             targetPath:AFN           ,tmp    
             response:      
                :           
              :block  ,           
            response:   
            filePath:           ==       block    
            error:    
         */
    
        //2.1       
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];
    
        //2.2       ,   
        NSProgress *progress = nil;
    
        NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    
            NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    
            //       
            NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];
            NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
            return filePathUrl;
    
        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {
    
            NSLog(@"      ---%@",filePath);
        }];
    
        //2.3   KVO      
        [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
    
        //3.    
        [downloadTask resume];
    }
    
    //              
    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary *)change context:(void *)context
    {
        NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
    }
    

    2. AFN 파일 업로드 1. 파일 업로드 연결 데이터 의 첫 번 째 방식
    [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
    

    2. 파일 에 맞 춤 형 데 이 터 를 업로드 하 는 두 번 째 방법
     [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
    

    3. 파일 에 맞 춤 형 데 이 터 를 업로드 하 는 세 번 째 방식
     [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    

    4. [주] 자료 에 파일 업로드 에 사용 할 분 류 를 제 공 했 습 니 다.
    / 파일 업로드 와 관련 된 코드 는 다음 과 같 습 니 다 /
    -(void)upload {
        //1.         
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //2.  POST      
        /*
              :    :NSString  
              :         
              :block  
                 ,    formData            
              :     block  
            task:dataTask(  )
            responseObject:        
              :     block  
            error:    ,        ,  error            
         */
    
        NSDictionary *dict = @{
                               @"username":@""
                               };
    
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id  _Nonnull formData) {
    
            //         NSData     
            UIImage *image = [UIImage imageNamed:@"123"];
            NSData *data = UIImagePNGRepresentation(image);
    
            /*
             //         
                  :            
                  :          
                  :                      
                  :     MIMEType  
             */
            [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
    
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"    ---%@",responseObject);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"    --%@",error);
        }];
    }
    
    -(void)upload2 {
        NSLog(@"%s",__func__);
    
        //1.         
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //2.  POST      
        /*
              :    :NSString  
              :         
              :block  
              ,    formData            
              :     block  
         task:dataTask(  )
         responseObject:        
              :     block  
         error:    ,        ,  error            
         */
    
        NSDictionary *dict = @{
                               @"username":@""
                               };
    
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id  _Nonnull formData) {
    
            //     url
            NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/username/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];
            /*
             //         
                  :      url  
                  :          
                  :                 
                  :   mimetype  
                  :    
             */
    //        [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
    
            //           
            /*
               :           ,                   url          ,              mimetype  
             */
            [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    
    
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"    ---%@",responseObject);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"    --%@",error);
        }];
    }
    

    3. AFN 을 사용 하여 직렬 화 처리 / * 1. AFN 내부 에서 기본적으로 서버 응답 데 이 터 를 json 으로 해석 하기 때문에 서버 가 JSON 데이터 가 아 닌 것 으로 되 돌아 오 면 오 류 를 요청 합 니 다. 이 럴 때 응답 정보 에 대한 AFN 분석 방식 을 설정 해 야 합 니 다.AFN 은 다음 과 같은 세 가지 응답 정 보 를 분석 하 는 방식 을 제공 했다.
  • AFHTTPResponsesSerializer - --- 기본 바 이 너 리 응답 데이터 3) AFJSON ResponsesSerializer - --- JSON
  • 2. 서버 가 우리 에 게 되 돌려 준 데이터 형식 이 일치 하지 않 는 경우 도 있 습 니 다 (개발 자 도구 Content - type: text / xml). 그러면 요청 이 성공 하지 못 할 수도 있 습 니 다.해결 방법: 1) 소스 코드 에서 직접 수정 하고 해당 하 는 Content - Type 2 를 추가) 이 속성 을 가 져 와 집합 에 추가 합 니 다.
    3. 관련 코드
    -(void)serialized {
        //1.       ,    NSURLSession
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        /*    1:  AFN                   */
    
        //      XML,    AFN,       XML     
        manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
        //            ,                 
        //manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
        //  JSON        
        //manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
    
        /*   2   AFN,               ,      
        [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/xml"];
    
        //2.                  ,GET                 &        ?           
        NSDictionary *dict = @{
                               @"username":@"223",
                               @"pwd":@"ewr",
                               @"type":@"XML"
                               };
    
        //3.  GET  
        [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    
            //4.       block
            NSLog(@"%@",[responseObject class]);
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
    
            //5.       ,    error        
            NSLog(@"%@",error);
        }];
    }
    

    4. AFN 을 사용 하여 네트워크 상 태 를 감지 합 니 다 / * 설명: AFN 프레임 워 크 의 AFNetworkReachability Manager 를 사용 하여 네트워크 상태의 변 화 를 감청 할 수도 있 고 애플 이 제공 하 는 Reachability 를 이용 하여 감청 할 수도 있 습 니 다.개발 중 AFN 프레임 워 크 처 리 를 직접 사용 하 는 것 을 권장 합 니 다. * / /네트워크 상태의 변 화 를 AFN 프레임 워 크 로 감지 합 니 다.
    -(void)AFNReachability {
        //1.         
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
        //2.         
        /*
         AFNetworkReachabilityStatusUnknown          =   
         AFNetworkReachabilityStatusNotReachable     =     
         AFNetworkReachabilityStatusReachableViaWWAN = 3G
         AFNetworkReachabilityStatusReachableViaWiFi = WIFI
         */
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusUnknown:
                    NSLog(@"  ");
                    break;
                case AFNetworkReachabilityStatusNotReachable:
                    NSLog(@"    ");
                    break;
                case AFNetworkReachabilityStatusReachableViaWWAN:
                    NSLog(@"3G");
                    break;
                case AFNetworkReachabilityStatusReachableViaWiFi:
                    NSLog(@"WIFI");
                    break;
    
                default:
                    break;
            }
        }];
    
        //3.    
        [manager startMonitoring];
    }
    

    / / 애플 이 제공 하 는 Reachability 를 사용 하여 네트워크 상 태 를 감지 하고 네트워크 상 태 를 지속 적 으로 감청 하려 면 알림 과 함께 사용 해 야 합 니 다.
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        //1.      
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];
    
        //2.      ,          
        Reachability *r = [Reachability reachabilityForInternetConnection];
        [r startNotifier];
    
        //     ,         
        self.r = r;
    }
    
    //         ,       
    -(void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    -(void)networkChange
    {
        //         
       if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
        {
            NSLog(@"       3G");
            return;
        }
    
        if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
        {
            NSLog(@"       wifi");
            return;
        }
    
        NSLog(@"      ");
    }
    

    5. AFN 사용 기법 1. 개발 할 때 도구 류 를 만 들 수 있 습 니 다. AFN 에서 요청 한 관리 자 를 계승 하고 컨트롤 러 에서 요청 한 코드 는 자신 이 봉 인 된 도구 류 를 사용 합 니 다.2. 이렇게 하 는 장점 은 나중에 바 텀 의존 구 조 를 수정 하면 우 리 는 이 도구 류 를 수정 하면 되 고 더 이상 수정 하지 않 아 도 된다 는 것 이다.3. 이 도구 류 는 일반적으로 하나의 사례 방법 을 제공 하 는데 이 방법 에서 기본 적 인 요청 경 로 를 설정 합 니 다.4. 이 방법 은 보통 GET 나 POST 요청 에 대한 패 키 지 를 제공 합 니 다.5. 외부 에 있 을 때 이 도구 클래스 를 통 해 요청 을 보 냅 니 다. 6. 단일 방법:
    + (instancetype)shareNetworkTools {
        static XMGNetworkTools *instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //   : BaseURL     /  
            instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
        });
        return instance;
    }
    

    좋은 웹페이지 즐겨찾기