YTK의 간단한 사용 강좌

11736 단어

YTKNetwork 기본 구성


YTKNetwork는 다음과 같은 기본 클래스를 포함합니다.
  • YTKNetworkConfig 클래스: 네트워크 요청을 통일적으로 설정하는 서버와 CDN의 주소입니다.
  • YTKREquest 클래스: 모든 네트워크 요청 클래스는 YTKRequest 클래스에 계승되어야 하며, 각각YTKRequest 클래스의 하위 클래스는 전문적인 네트워크 요청을 대표한다.

  • 이어서 우리는 이 종류들과 그것들의 용법을 상세하게 설명할 것이다.

    YTKNetworkConfig 클래스


    YTKNetworkConfig 클래스에는 다음과 같은 두 가지 기능이 있습니다.
  • 네트워크 요청 서버와 CDN의 주소를 통일적으로 설정합니다.
  • 네트워크 요청을 관리하는 YTKURLFilterProtocol 인스턴스(고급 기능 강좌에 설명되어 있음).

  • 우리는 왜 서버 주소를 통일적으로 설정해야 합니까?왜냐하면:
  • 디자인 모델의 Do Not Repeat Yourself 원칙에 따라 우리는 서버 주소를 한 곳에 통일적으로 써야 한다.
  • 실제 업무에서 우리의 테스트 인원은 서로 다른 서버 주소를 바꾸어 테스트해야 한다.서버 주소를 YTKNetworkConfig 클래스에 통일적으로 설정하면 서버 주소를 통일적으로 전환할 수 있습니다.

  • 구체적인 사용법은 프로그램이 시작된 리셋에서 다음과 같이 YTKNetworkConfig에 대한 정보를 설정하는 것이다.
    - (BOOL)application:(UIApplication *)application 
       didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
       YTKNetworkConfig *config = [YTKNetworkConfig sharedInstance];
       config.baseUrl = @"http://yuantiku.com";
       config.cdnUrl = @"http://fen.bi";
    }
    

    설정이 완료되면 모든 네트워크 요청은 기본적으로 YTKNetworkConfig의 매개변수에 지정된 주소를 사용합니다.
    대부분의 기업 응용 프로그램은 일부 정적 자원(예를 들어 그림, js, css)에 대해 CDN을 사용해야 한다.YTKNetworkConfig의 baseUrl 매개변수는 이 네트워크 요청의 주소를 통일적으로 설정하는 데 사용됩니다.
    서버 주소를 전환해야 할 경우 YTK Network Config의 cdnUrlbaseUrl 매개변수만 수정하면 됩니다.

    YTKREquest 클래스


    YTK Network의 기본적인 사상은 모든 네트워크 요청을 대상으로 봉인하는 것이다.따라서 YTK Network를 사용하면 모든 요청은 YTKREquest 클래스를 계승하고 부모 클래스를 덮어쓰는 방법을 통해 지정한 네트워크 요청을 구성해야 합니다.모든 네트워크 요청을 대상으로 봉인하는 것은 디자인 모드의Command 모드를 사용한 것이다.
    모든 네트워크 요청은 YTKREquest 클래스를 계승한 후 방법 덮어쓰기 (overwrite) 방식으로 네트워크 요청의 구체적인 정보를 지정해야 한다.다음은 예입니다.
    만약 우리가 사이트 주소 cdnUrlhttp://www.yuantiku.com/iphone/register 요청을 보내려면, 요청 매개 변수는username과password입니다.그러면 이 클래스는 다음과 같이 해야 합니다.
    // RegisterApi.h
    #import "YTKRequest.h"
    
    @interface RegisterApi : YTKRequest
    
    - (id)initWithUsername:(NSString *)username password:(NSString *)password;
    
    @end
    
    
    // RegisterApi.m
    
    
    #import "RegisterApi.h"
    
    @implementation RegisterApi {
        NSString *_username;
        NSString *_password;
    }
    
    - (id)initWithUsername:(NSString *)username password:(NSString *)password {
        self = [super init];
        if (self) {
            _username = username;
            _password = password;
        }
        return self;
    }
    
    - (NSString *)requestUrl {
        // “http://www.yuantiku.com”   YTKNetworkConfig  , 
        return @"/iphone/register";
    }
    
    - (YTKRequestMethod)requestMethod {
        return YTKRequestMethodPost;
    }
    
    - (id)requestArgument {
        return @{
            @"username": _username,
            @"password": _password
        };
    }
    
    @end
    
    

    위의 예제에서 우리는 다음과 같이 볼 수 있다.
  • 우리는 YTKREquest 클래스를 덮어쓰는 POST 방법을 통해 지정된 사이트 정보를 실현했다.그리고 도메인 이름을 제외한 나머지 사이트 정보만 지정하면 됩니다. 도메인 정보는 YTK Network Config에 이미 설정되어 있기 때문입니다.
  • 우리는 YTKREquest 클래스를 덮어쓰는 requestUrl 방법을 통해 지정된 POST 방법으로 매개 변수를 전달했다.
  • 우리는 YTKREquest 클래스를 덮어쓰는 requestMethod 방법을 통해 POST 정보를 제공했다.이 안의 매개 변수 requestArgumentusername 는 일부 특수 문자 (예를 들어 중국어나 공백) 가 있으면 자동으로 인코딩됩니다.

  • RegisterApi 호출


    구조가 RegisterApi를 완성한 후에 구체적으로 어떻게 사용합니까?로그인한 ViewController에서 RegisterApi를 호출하고 블록 방식으로 네트워크 요청 결과를 얻을 수 있습니다.
    - (void)loginButtonPressed:(id)sender {
        NSString *username = self.UserNameTextField.text;
        NSString *password = self.PasswordTextField.text;
        if (username.length > 0 && password.length > 0) {
            RegisterApi *api = [[RegisterApi alloc] initWithUsername:username password:password];
            [api startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {
                //   self
                NSLog(@"succeed");
    
            } failure:^(YTKBaseRequest *request) {
                //   self
                NSLog(@"failed");
            }];
        }
    }
    
    

    주의: 블록 리셋에서 직접 사용할 수 있습니다 password. 순환 인용은 걱정하지 마세요.YTKREquest는 Block 리셋을 수행한 후 해당 Block을 nil로 설정하기 때문입니다.순환 인용을 깨뜨리다.
    Block의 콜백 방식 외에도 YTKREquest는 delegate 방식의 콜백을 지원합니다.
    - (void)loginButtonPressed:(id)sender {
        NSString *username = self.UserNameTextField.text;
        NSString *password = self.PasswordTextField.text;
        if (username.length > 0 && password.length > 0) {
            RegisterApi *api = [[RegisterApi alloc] initWithUsername:username password:password];
            api.delegate = self;
            [api start];
        }
    }
    
    - (void)requestFinished:(YTKBaseRequest *)request {
        NSLog(@"succeed");
    }
    
    - (void)requestFailed:(YTKBaseRequest *)request {
        NSLog(@"failed");
    }
    

    서버 반환 내용 확인


    때때로 서버의 버그로 인해 서버가 일부 비합법적인 데이터를 되돌려 줄 수 있다. 만약에 맹목적으로 이 데이터를 신뢰한다면 클라이언트 Crash를 초래할 수 있다.만약 대량의 검증 코드를 넣으면 프로그래밍의 체력 노동이 증가하고 시간이 걸린다.
    YTKREquest의 검증 서버 반환값 기능을 사용하면 검증 코드의 작성 시간을 크게 절약할 수 있습니다.
    예를 들어 우리는 사이트 주소selfhttp://www.yuantiku.com/iphone/users 요청을 보내야 한다. 요청 매개 변수는 GET 이다.우리는 어떤 사용자의 정보를 얻고 싶습니다. 그의 닉네임과 등급을 포함합니다. 서버가 닉네임(문자열 유형)과 등급 정보(수치 유형)를 되돌려야 합니다. 덮어쓰기userId 방법으로 간단한 검증을 실현할 수 있습니다.
    - (id)jsonValidator {
        return @{
            @"nick": [NSString class],
            @"level": [NSNumber class]
        };
    }
    

    전체 코드는 다음과 같습니다.
    // GetUserInfoApi.h
    #import "YTKRequest.h"
    
    @interface GetUserInfoApi : YTKRequest
    
    - (id)initWithUserId:(NSString *)userId;
    
    @end
    
    
    // GetUserInfoApi.m
    #import "GetUserInfoApi.h"
    
    @implementation GetUserInfoApi {
        NSString *_userId;
    }
    
    - (id)initWithUserId:(NSString *)userId {
        self = [super init];
        if (self) {
            _userId = userId;
        }
        return self;
    }
    
    - (NSString *)requestUrl {
        return @"/iphone/users";
    }
    
    - (id)requestArgument {
        return @{ @"id": _userId };
    }
    
    - (id)jsonValidator {
        return @{
            @"nick": [NSString class],
            @"level": [NSNumber class]
        };
    }
    
    @end
    
    

    다음은 더 많은 jsonValidator의 예입니다.
  • String 배열 반환 요구:
  • - (id)jsonValidator {
        return @[ [NSString class] ];
    }
    
  • 원숭이 라이브러리 온라인 환경의 복잡한 예:
  • - (id)jsonValidator {
        return @[@{
            @"id": [NSNumber class],
            @"imageId": [NSString class],
            @"time": [NSNumber class],
            @"status": [NSNumber class],
            @"question": @{
                @"id": [NSNumber class],
                @"content": [NSString class],
                @"contentType": [NSNumber class]
            }
        }];
    } 
    

    CDN 주소 사용


    CDN 주소를 사용하려면 YTKREquest 클래스jsonValidator 메서드를 덮어쓰기만 하면 됩니다.
    예를 들어 우리는 그림을 찾는 인터페이스가 있는데 주소가 - (BOOL)useCDN; 이면 우리는 이렇게 코드를 쓸 수 있다.
    // GetImageApi.h
    #import "YTKRequest.h"
    
    @interface GetImageApi : YTKRequest
    - (id)initWithImageId:(NSString *)imageId;
    @end
    
    // GetImageApi.m
    #import "GetImageApi.h"
    
    @implementation GetImageApi {
        NSString *_imageId;
    }
    
    - (id)initWithImageId:(NSString *)imageId {
        self = [super init];
        if (self) {
            _imageId = imageId;
        }
        return self;
    }
    
    - (NSString *)requestUrl {
        return [NSString stringWithFormat:@"/iphone/images/%@", _imageId];
    }
    
    - (BOOL)useCDN {
        return YES;
    }
    
    @end
    

    단점 속전


    브레이크 리셋 기능을 시작하려면 http://fen.bi/image/imageId 방법을 덮어쓰고 브레이크 리셋 시 파일의 임시 저장 경로를 지정하면 됩니다.다음 코드는 방금 그림을 추출한 인터페이스를 인터럽트 리셋을 지원하는 것으로 변경했습니다.
    @implementation GetImageApi {
        NSString *_imageId;
    }
    
    - (id)initWithImageId:(NSString *)imageId {
        self = [super init];
        if (self) {
            _imageId = imageId;
        }
        return self;
    }
    
    - (NSString *)requestUrl {
        return [NSString stringWithFormat:@"/iphone/images/%@", _imageId];
    }
    
    - (BOOL)useCDN {
        return YES;
    }
    
    - (NSString *)resumableDownloadPath {
        NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *cachePath = [libPath stringByAppendingPathComponent:@"Caches"];
        NSString *filePath = [cachePath stringByAppendingPathComponent:_imageId];
        return filePath;
    }
    
    @end
    

    시간별 컨텐츠 캐시


    방금 GetUser InfoApi를 썼습니다. 이 네트워크 요청은 사용자의 자료를 얻는 것입니다.
    우리는 이러한 장면을 상상한다. 만약에 당신이 마이크로 블로그와 같은 클라이언트를 완성하고 있다면, GetUser InfoApi는 당신의 친구의 자료를 얻는 데 사용된다. 왜냐하면 친구는 닉네임을 그렇게 자주 바꾸지 않기 때문이다. 그러면 짧은 시간 안에 이 인터페이스를 자주 호출하면 매번 같은 내용을 되돌릴 수 있기 때문에 우리는 이 인터페이스에 캐시를 추가할 수 있다.
    다음 예시에서 우리는 덮어쓰기 resumableDownloadPath 방법을 통해 GetUser InfoApi에 3분 캐시를 추가했고 3분 안에 Api를 조정하는 start 방법을 호출했지만 실제 요청은 보내지 않았다.
    @implementation GetUserInfoApi {
        NSString *_userId;
    }
    
    - (id)initWithUserId:(NSString *)userId {
        self = [super init];
        if (self) {
            _userId = userId;
        }
        return self;
    }
    
    - (NSString *)requestUrl {
        return @"/iphone/users";
    }
    
    - (id)requestArgument {
        return @{ @"id": _userId };
    }
    
    - (id)jsonValidator {
        return @{
            @"nick": [NSString class],
            @"level": [NSNumber class]
        };
    }
    
    - (NSInteger)cacheTimeInSeconds {
        // 3  = 180  
        return 60 * 3;
    }
    
    @end
    

    이 캐시 논리는 상부에 투명하기 때문에 상부는 캐시 논리를 고려하지 않고 GetUser InfoApi의 start 방법을 호출할 때마다 사용할 수 있다.GetUserInfoApi는 캐시가 만료된 경우에만 네트워크 요청을 실제로 전송합니다.
    위의 예제 코드는 Demo 프로젝트에서도 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기