iOS 의 block 에 대한 약간의 이해

3826 단어 iOSblock
block 은 대상 입 니 다.코드 를 봉 인 했 습 니 다.이 코드 는 언제든지 실행 할 수 있 습 니 다.block 은 함수 매개 변수 나 함수 의 반환 값 으로 사용 할 수 있 으 며,그 자체 가 입력 매개 변수 나 반환 값 을 가 져 올 수 있 습 니 다.이것 은 전통 적 인 함수 포인터 와 매우 유사 하지만 차이 가 있 습 니 다.block 은 inline 이 고 국부 변수 에 대해 서 만 읽 습 니 다.
Block 의 정의:

   int (^myBlock) (int a,int b) = ^(int a,int b){ 
    return a+b; 
  }; 
 my Block 이라는 Blocks 대상 을 정의 합 니 다.두 개의 int 인 자 를 가지 고 int 로 돌아 갑 니 다.등식 오른쪽 은 Blocks 의 구체 적 인 실현 입 니 다.약간 방법의 정의 와 같 지 않 습 니까?
Block 은 부분 변수 에 접근 할 수 있 지만 수정 할 수 없습니다.예 를 들 어 아래 의 코드 는 번역 이 틀 릴 것 이다.

int num = 0; 
  //  block  
  int (^myBlock) (int a,int b) = ^(int a,int b){ 
    num = a+b; 
    return num; 
  }; 
수정 하려 면 키 워드 를 추가 해 야 합 니 다:block(주의,두 밑줄"")

__block int num = 0; 
  //  block  
  int (^myBlock) (int a,int b) = ^(int a,int b){ 
    num = a+b; 
    return num; 
  }; 
함수 의 매개 변수 로 서 Blocks 는 어떤 의미 에서 반전 함수 나 delegate 를 대체 합 니 다.함수 가 호출 되면 어떤 이벤트 가 촉발 된다 고 가정 하면 block 의 내용 이 실 행 됩 니 다.이렇게 하면 코드 의 통합 과 읽 기 에 유리 하 므 로,너 는 여기저기 서 위탁 방법 을 실현 할 필요 가 없다.
이상 은 블록 기본 지식 입 니 다.다음은 자신의 학습 경험 을 말씀 드 리 겠 습 니 다.
objective-c 를 처음 접 했 을 때 block 을 보 았 을 때 문법 형식 에 깜짝 놀 라 어색 했다.처음에는 블록 을 코드 세그먼트 로 만 생각 했 을 뿐 위력 을 보지 못 했다.프로젝트 에 네트워크 요청 작업 이 포함 되 어 있 기 때문에 비동기 처리 가 필요 합 니 다.block 을 사용 해 야 진정 으로 알 수 있 습 니 다.블록 이 어떻게 비동기 처 리 를 하 는 지 알려 드 리 겠 습 니 다.
A 에 게 임무 가 있다 고 가정 하면 창고 에 가서 A4 용지 한 장 을 회의실 에 가 져 다 놓 고 종이 에 기획 서 를 쓰 는 것 이다.종 이 를 가 져 오 려 면 창고 관리 원 을 거 쳐 야 하기 때문에 A 는 창고 관리자 에 게 종 이 를 한 장 가 져 오 라 고 통지 했다.관리 자 는 노인 이기 때문에 동작 이 느 리 고 A 는 다른 일이 있 습 니 다.관리 자 를 기다 리 면 시간 을 너무 낭비 합 니 다.합 리 적 인 방법 은 창고 관리자 에 게 종 이 를 찾 는 일 을 하 게 하 는 것 입 니 다.A 는 관리자 에 게 알 린 후에 자신의 일 을 계속 하 는 것 입 니 다.A.창고 관리인 이 언제 종 이 를 찾 을 수 있 는 지 모 르 고 종이 에 기획 서 를 쓸 수 있 는 지 모 릅 니 다.이때 block 메커니즘 이 도움 이 되 었 습 니 다.이런 메커니즘 을 사용 하면 A 가 창고 관리자 에 게 종 이 를 찾 으 라 고 통지 하 는 동시에 창고 관리자 에 게 종 이 를 번호 XX 회의실 에 놓 고 종이 에 쓸 기획 내용 을 배정 할 수 있 습 니 다.관리자 가 종 이 를 가 져 오 면 한 조수 가 기획 내용 을 종이 에 쓸 수 있 습 니 다.
우 리 는 이 이 야 기 를 코드 에 대응한다.

#pragma mark -       
 
- (void)btnLoginWeiboClicked:(id)sender { 
   
  [_waitCircle startAnimating]; 
   
  [[HSLoginClass createInstance] loginWithPlatformType:ShareTypeSinaWeibo withBlock:^(BOOL success, id message) { 
    if (success) { 
      //       
      [self dismissViewControllerAnimated:YES completion:^{}]; 
      [_waitCircle stopAnimating]; 
      NSLog(@"     %@", message); 
       
    } else { 
    } 
  }]; 
 
  //test statistics 
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     
    NSDate* date = [NSDate date]; 
    NSTimeInterval nowTime = [date timeIntervalSince1970]; 
    NSString* netStatus = (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:NETSTATUS]; 
    [[HSStatisticsModule statisticsModule] makeSession:nowTime :OPER_IN :@"noid"]; 
    [[HSStatisticsModule statisticsModule] upLoadData:netStatus :[NSString stringWithFormat:@"%f", nowTime]]; 
     
  }); 
 
} 
이 코드 를 보십시오.전체 방법 은 A 가 해 야 할 일 입 니 다.startAnimating/login WithPlatformType/dispatchasync 는 각각 A 가 해 야 할 세 가지 임무 입 니 다.login WithPlatformType 은 시간 이 걸 려 야 완성 할 수 있 고 login WithPlatformType 이 완 성 된 후에 결과 에 따라 해당 하 는 처 리 를 해 야 하기 때문에 저 희 는 login WithPlatformType 에 대해 비동기 처 리 를 합 니 다.block 코드 세그먼트 는 login WithPlatformType 이 결 과 를 얻 은 후에 해 야 할 조작 H 입 니 다.여기 있 는 block 쓰기 방법 은 우리 가 먼저 H 를 조작 한 다음 에 다른 작업 을 계속 하 는 것 을 나타 냅 니 다.login WithPlatformType 이 ok 을 실행 한 후에 누군가가(그 조수 일 수도 있 습 니 다)작업 H 를 수행 할 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기