iOS 는 핵심 50 줄 코드 를 사용 하여 경로 구성 요 소 를 훑 습 니 다.

10745 단어 ios경로구성 요소
구성 요 소 를 사용 하 는 것 은 결합 처 리 를 위해 여러 모듈 간 에 협 의 를 통 해 상호작용 을 하 는 것 입 니 다.프로 토 콜 을 분석 하고 목적 컨트롤 러 를 찾 거나 호출 자 에 게 되 돌아 오 는 이 구성 요 소 는 경로 구성 요소 입 니 다.본 고 는 핵심 적 인 50 줄 코드 를 어떻게 사용 하여 경로 구성 요 소 를 실현 하 는 지 설명 한다.

  • 구성 요소 화 및 경로

  • 경로 의 실현
  • 경로 등록 실현
    경로 사용 실현

  • 클 라 이언 트 사용

  • 작은 생각
  • 구성 요소 화 및 경로
    이전에 경로 관리,경로 처리 에 관 한 글 을 많이 봤 는데 구성 요소 화 와 함께 자주 등장 했다.처음에 왜 경로 와 구성 요소 화가 함께 나타 나 는 지 몰 랐 다.나중에 회사 의 프로젝트 에서 경로 구성 요소(그 자체 도 하나의 구성 요소 이 고 확실한 것 은 중개인 이나 중개자)를 사 용 했 기 때문에 갑자기 알 게 되 었 다.그 렇 구나.
    구성 요 소 를 사용 하 는 것 은 결합 처 리 를 위해 여러 모듈 간 에 협 의 를 통 해 상호작용 을 하 는 것 입 니 다.프로 토 콜 을 분석 하고 목적 컨트롤 러 를 찾 거나 호출 자 에 게 되 돌아 오 는 이 구성 요 소 는 경로 구성 요소 입 니 다.
    루트 구성 요소 의 직책 은 주로:
    등록 자 에 게 등록 인 터 페 이 스 를 제공 하 다.
    등록 자 는 path 와 path 에 대응 하 는 block 을 전달 하고 block 의 구체 적 인 실현 은 등록 자 스스로 처리 합 니 다.
    호출 자 에 게 인터페이스 제공
    호출 자 는 경로 구성 요소 에 path 를 전달 하여 호출 할 수 있 습 니 다.경로 구성 요 소 는 구체 적 인 처 리 를 등록 자 에 게 전달 합 니 다.이론 적 으로 페이지 전환,팝 업 창 알림,값 을 호출 자 에 게 되 돌려 주 는 등 임의로 조작 할 수 있 습 니 다.
    다음은 상기 분석 을 바탕 으로 간단 한 경로 구성 요 소 를 실현 할 것 입 니 다.해당 하 는 코드 는 YTROuterDemo 에서 찾 을 수 있 습 니 다.
    경로 의 실현
    경로 의 실현 은 두 부분 을 포함한다.경로 등록 실현 과 경로 사용 실현 이다.
    경로 등록 실현
    루트 등록 실현 순서 도:

    위의 그림 에서 보 듯 이 절 차 는 매우 간단 하 다.
  • YTROUTerAction Object 대상 을 초기 화하 여 path 와 대응 하 는 blok 를 저장 합 니 다
  • 경로 에 대응 하 는 노드 를 가 져 옵 니 다.path 는"/"자 를 사용 하여 여러 개의 pathItem 으로 나 누 어 집 니 다.모든 pathItem 은 하나의 Dictionary 가 대응 하 는 위치 에 저 장 됩 니 다.subRouterMapWithPath 는 Dictionary 를 깊이 있 게 옮 겨 다 니 고 해당 하 는 위 치 를 찾 습 니 다.
  • YTROUTerAction Object 대상 을 이전 단계 에서 찾 은 위치 에 저장 합 니 다
  • 상기 절차 에 대응 하 는 코드 는 다음 과 같다.
    
    - (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 를 등록 하 는 것 은 성능 에 어느 정도 영향 을 미친다.만약 에 여기 가 성능 병목 이 된다 면 이 부분 코드 를 대상 방법 에 두 고 초기 화 하 는 것 을 고려 해 야 한다.예 를 들 어 메 인 모듈 에서 메 시 지 를 각 모듈 에 보 낸 다음 에 각 모듈 에서 등록 을 처리 하 는 것 이다.
  • YTROuterAction Object 가 더 높 은 부 드 러 움 이 필요 하 다 면 path 매개 변 수 를 components 로 해석 하여 캐 시 하 는 것 을 고려 할 수 있 습 니 다.이것 은 공간 으로 시간 을 바 꾸 는 전략 으로 검색 의 효율 을 높이 기 위해 Dictionary 를 사용 하여 RouterAction Object 를 저장 하 는 것 이 아 닙 니 다
  • 검색 의 효율 성 을 높이 기 위해 그룹 이 아 닌 Dictionary 를 사용 하여 RouterAction Object 를 저장 합 니 다
  • 총결산
    위 에서 말 한 것 은 소 편 이 소개 한 iOS 에서 핵심 적 인 50 줄 코드 를 사용 하여 경로 구성 요 소 를 훑 어 보 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기