iOS 개발 --- 네트워크 요청 (사용자 정의 요청 관리 클래스, Block 에서 값 전송 문제 해결)

현재 인터넷 요청 을 배 웠 고 AFNetworking 라 이브 러 리 로 JSon 의 분석 도 하고 있 습 니 다. 하지만 매번 ViewController 에서 요청 을 받 는 것 이 번 거 로 운 것 같 습 니 다. 그러면 제 가 요청 한 데 이 터 를 따로 쓰 고 돌아 갈 수 있 을 까요? 물론 입 니 다.
    
        이 방법 에 대해 집주인 의 첫 번 째 생각 은 사용자 정의 Manager 류 에 배열 속성 을 추가 하 는 것 입 니 다. 저 는 viewController 에서 get 방법 으로 데 이 터 를 얻 으 면 데 이 터 를 얻 을 수 있 습 니 다. 저 뿐만 아니 라 이런 생각 도 좋 지만 현실 에 맞지 않 습 니 다. 먼저 코드 를 드 리 겠 습 니 다.물론 아래 코드 는 값 을 전달 할 수 없습니다. 모든 국가의 이름 정 보 를 얻 기 위해 서 입 니 다.
/**
 *        
 */
-(void *)loadCountry
{
    //     
    self.country = [NSArray array];

    //     
    NSDictionary * dict = @{@"access_token":token};
   __block __weak CountryManager * copy_self = self;

    //    
    [self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operaton, NSData * data) {
        
        NSError * error;
        
        //  Json  
        copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];//          
        
        //    
        if (error)
        {
            NSLog(@"error = %@",[error localizedDescription]);
        }
        
    } failure:^void(AFHTTPRequestOperation * operation, NSError * error) {
        
        NSLog(@"error = %@",[error localizedDescription]);
        
    }];
}

       만약 에 우리 가 이런 방법 으로 값 을 전달 하려 면 얻 은 배열 은 block 코드 블록 에 만 값 이 있 을 수 있 습 니 다. 코드 블록 이 나 오 면 우 리 는 viewController 에서 이 방법 으로 값 을 붙 인 것 처럼 생각 하지만 배열 의 값 은 @ [] 입 니 다. 즉, 아무런 값 도 없 는 배열 입 니 다. 이 방법 을 사용 하 는 사람 도 모두 깨 달 았 습 니 다.그것 은 Block 코드 블록 에서 우리 가 수정 한 속성 값 이나 구성원 변수의 값 이 밖으로 전달 되 지 못 하기 때 문 입 니 다. C 언어의 함수 와 비슷 하지만 다 르 기 때 문 입 니 다. 그러면 우 리 는 이 문 제 를 어떻게 해결 해 야 합 니까? 코드 블록 을 해결 하 는 방법 은 당연히 코드 블록 을 사용 해 야 합 니 다.
1. 먼저 Country Manager. h 에서 코드 블록 을 설명 해 야 합 니 다.
//     
typedef void(^COY)(NSArray * array);
//         
-(void)loadCountry:(COY)coy;

2. Country Manager. m 파일 에서 다음 속성 을 확장 합 니 다.
//
//  CountryManager.m
//      (        ,   Block     )(  )
//
//  Created by YueWen on 15/9/15.
//  Copyright (c) 2015  YueWen. All rights reserved.
//

#import "CountryManager.h"
#import "AFNetworking.h"
#import "Information.h"


@interface CountryManager ()

//AFNetWorking           
@property(nonatomic,strong)AFHTTPRequestOperationManager * operationManager;

//       
@property(nonatomic,strong)NSArray * country;

@end

3. 우 리 는 m 에서 방법 을 실현 한다.
/**
 *           
 *
 *  @param coy        
 */
-(void)loadCountry:(COY)coy
{
    //     
    self.country = [NSArray array];
    
    //     
    NSDictionary * dict = @{@"access_token":token};
   __block __weak CountryManager * copy_self = self;
    
    //    
    [self.operationManager GET:countryURL parameters:dict success:^void(AFHTTPRequestOperation * operation, NSData * data) {
        
        NSError * error;
        
        //  Json      
        copy_self.country = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
        
        //    
        if (error)
        {
            NSLog(@"%@",[error localizedDescription]);
        }
        
        //           
        coy(copy_self.country);

        
    } failure:^void(AFHTTPRequestOperation * operation, NSError * error) {
        
        NSLog(@"error = %@",[error localizedDescription]);
    }];

}

4. 그러면 우 리 는 view Controller 에서 우리 가 전달 한 배열 을 사용 할 수 있 습 니 다. 다음 과 같 습 니 다.
먼저 성명 하 다
//
//  TableViewController.m
//      (        ,   Block     )(  )
//
//  Created by YueWen on 15/9/15.
//  Copyright (c) 2015  YueWen. All rights reserved.
//

#import "TableViewController.h"
#import "Information.h"
#import "CountryManager.h"


@interface TableViewController ()

@property(nonatomic,strong)CountryManager * countryManager;
@property(nonatomic,strong)NSArray * countryData;//         

@end

그 다음은 저희 가 viewdLoad 에서 사용 하 게 되 었 습 니 다.
#pragma mark -        
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //        
    self.countryData = [NSArray array];
    
    //       
    self.navigationItem.title = @"  ";
    
    //  CountryManager  
    self.countryManager = [CountryManager shareCountryManager];
    
    //       
    __block __weak TableViewController * copy_self = self;
    
    //      
    [self.countryManager loadCountry:^(NSArray *array) {
        
        //  
        copy_self.countryData = array;
        
        //  tableView
        [copy_self.tableView reloadData];
        
    }];
    
}

아래 tableView 의 설정 도 더 이상 잔소리 하지 않 습 니 다. 핵심 코드 도 이렇게 많 습 니 다. 다른 전송 값 도 이렇게 사용 합 니 다. 성 과 를 살 펴 보 겠 습 니 다.

좋은 웹페이지 즐겨찾기