iOS 는 핵심 50 줄 코드 를 사용 하여 경로 구성 요 소 를 훑 습 니 다.
구성 요소 화 및 경로
경로 의 실현
경로 사용 실현
클 라 이언 트 사용
작은 생각
이전에 경로 관리,경로 처리 에 관 한 글 을 많이 봤 는데 구성 요소 화 와 함께 자주 등장 했다.처음에 왜 경로 와 구성 요소 화가 함께 나타 나 는 지 몰 랐 다.나중에 회사 의 프로젝트 에서 경로 구성 요소(그 자체 도 하나의 구성 요소 이 고 확실한 것 은 중개인 이나 중개자)를 사 용 했 기 때문에 갑자기 알 게 되 었 다.그 렇 구나.
구성 요 소 를 사용 하 는 것 은 결합 처 리 를 위해 여러 모듈 간 에 협 의 를 통 해 상호작용 을 하 는 것 입 니 다.프로 토 콜 을 분석 하고 목적 컨트롤 러 를 찾 거나 호출 자 에 게 되 돌아 오 는 이 구성 요 소 는 경로 구성 요소 입 니 다.
루트 구성 요소 의 직책 은 주로:
등록 자 에 게 등록 인 터 페 이 스 를 제공 하 다.
등록 자 는 path 와 path 에 대응 하 는 block 을 전달 하고 block 의 구체 적 인 실현 은 등록 자 스스로 처리 합 니 다.
호출 자 에 게 인터페이스 제공
호출 자 는 경로 구성 요소 에 path 를 전달 하여 호출 할 수 있 습 니 다.경로 구성 요 소 는 구체 적 인 처 리 를 등록 자 에 게 전달 합 니 다.이론 적 으로 페이지 전환,팝 업 창 알림,값 을 호출 자 에 게 되 돌려 주 는 등 임의로 조작 할 수 있 습 니 다.
다음은 상기 분석 을 바탕 으로 간단 한 경로 구성 요 소 를 실현 할 것 입 니 다.해당 하 는 코드 는 YTROuterDemo 에서 찾 을 수 있 습 니 다.
경로 의 실현
경로 의 실현 은 두 부분 을 포함한다.경로 등록 실현 과 경로 사용 실현 이다.
경로 등록 실현
루트 등록 실현 순서 도:
위의 그림 에서 보 듯 이 절 차 는 매우 간단 하 다.
- (void)registerPath:(NSString *)path actionBlock:(RouterActionBlock)actionBlock {
YTRouterActionObject *actionObject = [YTRouterActionObject new];
actionObject.path = path;
actionObject.actionBlock = actionBlock;
NSMutableDictionary *subRouter = [self subRouterMapWithPath:path];
subRouter[YTRouterActionObjectKey] = actionObject;
}
- (NSMutableDictionary *)subRouterMapWithPath:(NSString *)path {
NSArray *components = [path componentsSeparatedByString:@"/"];
NSMutableDictionary *subRouter = self.routerMap;
for (NSString *component in components) {
if (component.length == 0) {
continue;
}
if (!subRouter[component]) {
subRouter[component] = [NSMutableDictionary new];
}
subRouter = subRouter[component];
}
return subRouter;
}
Demo 에 등 록 된 몇 가지 경로 의 최종 설정 은 다음 과 같 습 니 다.예 를 들 어 home/messagelist 에 대응 하 는 경로 설정 은
Printing description of self->_routerMap:
{
home = {
"_" = "<YTRouterActionObject: 0x60c00003b040>";
messagelist = {
"_" = "<YTRouterActionObject: 0x6040000365e0>";
detail = {
"_" = "<YTRouterActionObject: 0x600000038ec0>";
};
getmessage = {
"_" = "<YTRouterActionObject: 0x600000038e80>";
};
};
};
}
경로 사용 실현경로 사용 실현 순서 그림:
위의 그림 에서 보 듯 이 절 차 는 매우 간단 하 다.
등 록 된 설정 에서 일치 하 는 YTROUTerAction Object 대상 을 찾 습 니 다.
YTRUnterAction Object 대상 의 actionBlock 을 실행 하면 YTRUnterAction CallbackObject 대상 을 전달 합 니 다.호출 자가 반환 값 이 필요 하 다 면 YTRUnterAction CallbackObject 대상 의 actionCallbackBlock 을 사용 하여 반환 값 을 전달 할 수 있 습 니 다.이 actionBlock 은 또 업무 자의 등록 자가 실현 한 것 입 니 다.
상기 절차 에 대응 하 는 코드 는 다음 과 같다.
- (BOOL)runWithActionCallbackObject:(YTRouterActionCallbackObject *)actionCallbackObject {
// scheme
if (![self canAcceptScheme:actionCallbackObject.uri.scheme]) {
return NO;
}
// path ActionObject
YTRouterActionObject *actionObject = [self actionObjectWithPath:actionCallbackObject.uri.path];
// Path Block
!actionObject.actionBlock ?: actionObject.actionBlock(actionCallbackObject);
return YES;
}
- (YTRouterActionObject *)actionObjectWithPath:(NSString *)path {
NSMutableDictionary *subRouter = [self subRouterMapWithPath:path];
return subRouter[YTRouterActionObjectKey];
}
클 라 이언 트 사용이상 에서 핵심 적 인 루트 등록 실현 과 루트 사용 실현 에 대해 언급 했 습 니 다.총 코드 는 50 줄 이 없 기 때문에 간단 합 니 다.다음은 클 라 이언 트 의 사용 절 차 를 설명 하 겠 습 니 다.
클 라 이언 트 등록 자 등록
클 라 이언 트 호출 자 사용클 라 이언 트 등록 자 등록
등록 시 기 는 비교적 찾 아야 합 니 다.통합 의 편 의 를 고려 하여 load 방법 에서 경로 등록 을 처리 하 는 것 을 선택 하 십시오.다음 코드 에서 보 듯 이 몇 가지 테스트 경 로 를 추가 하여 두 가지 상황 으로 나 누 어 사용 합 니 다.
1、반환 값 필요 없 음
다음 과 같이'home/messagelist'를 등록 한 것 은 한 페이지 가 이동 하 는 경로 입 니 다.actionBlock 의 인 자 는 YTRUnterAction CallbackObject 대상 입 니 다.YTRUnterAction CallbackObject 대상 이나 매개 변수 까지 어떻게 값 을 전달 하 는 지 에 대해 아래 클 라 이언 트 호출 자 에서 설명 할 수 있 습 니 다.그 다음 에 actionBlock 에서 목적 페이지 의 초기 화,파라미터 설정 등 절 차 를 처리 한 다음 에 페이지 전환 을 실행 합 니 다.
2、반환 값 필요
다음 과 같이"home/messagelist/getmessage"를 등록 하 는 것 은 반환 값 을 제공 하 는 경로 입 니 다.또한 YTRUnterAction CallbackObject 대상 에서 파 라 메 터 를 가 져 올 수 있 습 니 다.또한 YTRUnterAction CallbackObject 대상 에 또 하나의 actionCallbackBlock 속성 은 호출 자 에 게 반환 파 라 메 터 를 전문 적 으로 처리 하 는 것 입 니 다.다음 코드 는 문자열 만 간단하게 되 돌려 줍 니 다.더욱 구체 적 인 업무 장면 에서 여 기 는 인터페이스 호출,데이터 베이스 조회 등 임 무 를 설정 하고 마지막 으로 결 과 를 되 돌려 줍 니 다.
@implementation ModuleAUriRegister
+ (void)load {
[[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {
MessageListViewController *messageListVC = [MessageListViewController new];
NSString *title = callbackObject.uri.params[@"title"];
messageListVC.title = title;
[[UIViewController yt_currentViewControlloer].navigationController pushViewController:messageListVC animated:YES];;
}];
[[YTRouterManager sharedRouterManager] registerPath:@"home/" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {
}];
[[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist/detail" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {
}];
[[YTRouterManager sharedRouterManager] registerPath:@"home/messagelist/getmessage" actionBlock:^(YTRouterActionCallbackObject *callbackObject) {
//
!callbackObject.actionCallbackBlock ?: callbackObject.actionCallbackBlock(@"message content text demo");
}];
}
@end
클 라 이언 트 호출 자 사용1.간단 한 path 전환 호출
YTROuterManager 단일 대상 의 runWithPath 방법 을 사용 하여 등 록 된 path 인 자 를 전달 하여 점프 를 완료 합 니 다.
[self addActionWithTitle:@"Router " detailText:@"home/messagelist" callback:^{
[[YTRouterManager sharedRouterManager] runWithPath:@"home/messagelist"];
}];
2.URL 호출 과 URL 인자 호출 사용YTROuterManager 단일 대상 의 runWithurLString 방법 을 사용 하여 scheme/path 를 포함 하거나 매개 변수 가 있 는 경우 에 만 매개 변수 가 있 는 URL 을 전달 합 니 다.예 를 들 어"YTR"outer://home/messagelist"와"YTRouter://home/messagelist?title=Hello Message"는 구성 요소 에서 scheme,path,params 를 분석 하여 scheme 여과 처 리 를 합 니 다.path 조회 YTRUnterAction Object 대상 처리,매개 변수 전달 처리.
[self addActionWithTitle:@"Router URL " detailText:@"YTRouter://home/messagelist" callback:^{
[[YTRouterManager sharedRouterManager] runWithURLString:@"YTRouter://home/messagelist"];
}];
[self addActionWithTitle:@"Router URL " detailText:@"YTRouter://home/messagelist?title=Hello Message" callback:^{
[[YTRouterManager sharedRouterManager] runWithURLString:@"YTRouter://home/messagelist?title=Hello Message"];
}];
효 과 는 다음 그림 과 같다.효과 도
3.간단 한 path 전환 호출
YTRUnterManager 단일 대상 의 runWithAction CallbackObject 방법 을 사용 하여 YTRUnterAction CallbackObject 형식의 인 자 를 전달 하고 YTRUnterAction CallbackObject 대상 의 uri 와 결과 반전 actionCallbackBlock 인 자 를 설정 하여 actionCallbackBlock 에서 반환 값 을 처리 합 니 다.
[self addActionWithTitle:@"Router " detailText:@"home/messagelist/getmessage" callback:^{
__block id message = nil;
YTRouterActionCallbackObject *actionCallbackObject = [YTRouterActionCallbackObject new];
actionCallbackObject.uri = [[YTUri alloc] initWithPath:@"home/messagelist/getmessage"];
actionCallbackObject.actionCallbackBlock = ^(id result) {
message = result;
};
[[YTRouterManager sharedRouterManager] runWithActionCallbackObject:actionCallbackObject];
NSLog(@"message = %@", message);
}];
작은 생각4.567917.load 방법 에서 path 를 등록 하 는 것 은 성능 에 어느 정도 영향 을 미친다.만약 에 여기 가 성능 병목 이 된다 면 이 부분 코드 를 대상 방법 에 두 고 초기 화 하 는 것 을 고려 해 야 한다.예 를 들 어 메 인 모듈 에서 메 시 지 를 각 모듈 에 보 낸 다음 에 각 모듈 에서 등록 을 처리 하 는 것 이다.
위 에서 말 한 것 은 소 편 이 소개 한 iOS 에서 핵심 적 인 50 줄 코드 를 사용 하여 경로 구성 요 소 를 훑 어 보 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.