YTK의 간단한 사용 강좌
YTKNetwork 기본 구성
YTKNetwork는 다음과 같은 기본 클래스를 포함합니다.
YTKRequest
클래스에 계승되어야 하며, 각각YTKRequest
클래스의 하위 클래스는 전문적인 네트워크 요청을 대표한다.이어서 우리는 이 종류들과 그것들의 용법을 상세하게 설명할 것이다.
YTKNetworkConfig 클래스
YTKNetworkConfig 클래스에는 다음과 같은 두 가지 기능이 있습니다.
우리는 왜 서버 주소를 통일적으로 설정해야 합니까?왜냐하면:
Do Not Repeat Yourself
원칙에 따라 우리는 서버 주소를 한 곳에 통일적으로 써야 한다.구체적인 사용법은 프로그램이 시작된 리셋에서 다음과 같이 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의
cdnUrl
및 baseUrl
매개변수만 수정하면 됩니다.YTKREquest 클래스
YTK Network의 기본적인 사상은 모든 네트워크 요청을 대상으로 봉인하는 것이다.따라서 YTK Network를 사용하면 모든 요청은 YTKREquest 클래스를 계승하고 부모 클래스를 덮어쓰는 방법을 통해 지정한 네트워크 요청을 구성해야 합니다.모든 네트워크 요청을 대상으로 봉인하는 것은 디자인 모드의Command 모드를 사용한 것이다.
모든 네트워크 요청은 YTKREquest 클래스를 계승한 후 방법 덮어쓰기 (overwrite) 방식으로 네트워크 요청의 구체적인 정보를 지정해야 한다.다음은 예입니다.
만약 우리가 사이트 주소
cdnUrl
에 http://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
위의 예제에서 우리는 다음과 같이 볼 수 있다.
POST
방법을 통해 지정된 사이트 정보를 실현했다.그리고 도메인 이름을 제외한 나머지 사이트 정보만 지정하면 됩니다. 도메인 정보는 YTK Network Config에 이미 설정되어 있기 때문입니다.requestUrl
방법을 통해 지정된 POST 방법으로 매개 변수를 전달했다.requestMethod
방법을 통해 POST 정보를 제공했다.이 안의 매개 변수 requestArgument
와 username
는 일부 특수 문자 (예를 들어 중국어나 공백) 가 있으면 자동으로 인코딩됩니다.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의 검증 서버 반환값 기능을 사용하면 검증 코드의 작성 시간을 크게 절약할 수 있습니다.
예를 들어 우리는 사이트 주소
self
에 http://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의 예입니다.
- (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 프로젝트에서도 사용할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.