block 매개 변수로 전달

4577 단어

block


우리는 이전에 우리의 Block에 대해 이야기한 적이 있는데, 지금 우리는 다시 그를 꺼내서 다시 한 번 이야기해야 한다. 단지 이번에 우리는 Block에 관한 지식을 더욱 깊이 있게 설명할 것이다.

Block 검토


우리가 잘 아는 것은 바로 Block의 용법이다. 코드를 저장하는 것이다.
그리고 돌이켜보면 Block의 생성 방법과 호출 방법을 살펴보겠습니다. (아래 코드는viewDidLoad에 적혀 있습니다.)
//    block
// void:      
// (^blockName):     block   
// () :    block   
// ^{}: block      

void(^blockName)() = ^{

  NSLog(@"SB");
  NSLog(@"SB");
  NSLog(@"SB");
};

Block 호출 방법:
blockName();

인쇄:
** 2016-04-21 22:28:47.588 block[716:146584] SB 2016-04-21 22:28:47.589 block[716:146584] SB 2016-04-21 22:28:47.589 block[716:146584] SB **
Block을 만드는 단축키: inline Block을 직접 적으세요. 그러면 Block을 쉽게 만들 수 있습니다.
(^)() = ^() {
    
};

새로운 지식:
우리 Block도 사실 하나의 유형이다. 예를 들어 우리 int 형식, 더블 형식과 같다.
int 형식을 정의할 때 다음과 같습니다.
 int a = 0;

그럼 우리 Block은 어떻게 정의해야 하나요???
사실 우리가 typedef Block () 코드를 다 쓴 후에도 그는 다음과 같은 효과가 나타난다고 알릴 것이다.
typedef (^)();

우리는 Block:
typedef viod(^myBlock)();

그리고 Block을 만들 때 이렇게 할 수 있습니다. (int 형식의 생성과 유사합니다.)
myBlock blockName = ^{

  NSLog(@"SB");
  NSLog(@"SB");
  NSLog(@"SB");
};

우리가 호출할 때도 위와 같다.
모두들 이렇게 하는 것이 매우 지루하다고 생각하지 않습니까? 우리가 먼저 인쇄를 하거나 어떤 일을 하려면 코드를 직접 쓰면 끝이지 않습니까? Block을 왜 씁니까?
확실히 위의 코드는 여러분께 Block의 기본적인 역할을 보여 드릴 뿐입니다. 이제 Block의 기능을 말씀드리겠습니다.

Block이 매개 변수로 전달됨


예: 컨트롤 애니메이션 재생
우리는 모두 애니메이션의 재생에 대해 잘 알고 있다. 우리는 Block을 이용한다.
  • 우선, UIView를 드래그합니다.
  • 그리고 이 뷰에 애니메이션을 만들자
  • 이 애니메이션은 Block을 통해 만들었다
  • UIView 를 드래그하는 것은 간단합니다.
  • UIView 1개
  • Dell 디렉터의 속성으로 만들기 (SBView)
  • 직접 부호:
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
        [UIView animateWithDuration:1.0 animations:^{
    
            //       
            self.SBView.center = CGPointMake(100, 400);
        } completion:^(BOOL finished) {
    
            //           
            
        }];
    
    }
    

    이 방법은 바로 우리가 SBView를 눌렀을 때 그가 이 방법 위의 실행 애니메이션을 실행할 것이다. 시간은 1초이다.
    ** 다음은 이 방법에 따라 자신만의 실행 애니메이션을 쓰는 방법입니다.**
    사실 개발에서 Block은 방법의 매개 변수로 전달되었는데, 오늘날 이 사용자 정의 애니메이션 방법을 이용하여 Block이 어떻게 방법의 매개 변수로 전달되었는지 이해하고자 한다.
    먼저, 우리 시스템에서 우리 위의 방법에 대해 심층적인 것은 몇 줄의 코드이다.
    [UIView beginAnimations: nil context: nil];
    //       
    [UIView setAnimationDuration: 0.5];
    [UIView setAnimationDidStopSelector:@seletor(stop)];
    
    self.SBView.center = CGPointMake(100, 400);
    [UIView commitAnimations];
    
    -(void)stop{
    
      NSLog(@"    ");
    }
    

    **알겠습니다. 시스템은 실제로 그 방법을 호출했습니다. 다음은 저희가 정의한 애니메이션 방법을 시작합니다.**
    //        ,        :
    - (void)myAnimateWithDuration:(CGFloat)duration animations:(void(^)())animation completion:(void(^)())completion {
    
    [UIView beginAnimations: nil context: nil];
    [UIView setAnimationDuration: 0.5];
    [UIView setAnimationDidStopSelector:@seletor(stop)];
    animation();
    self.SBView.center = CGPointMake(100, 400);
    [UIView commitAnimations];
    

    }
    -(void)stop{
    
      NSLog(@"    ");
    } 
    

    우선, 우리는 다음과 같은 것을 고려해야 한다.
  • 우리 두 블록은 각각 그 코드를 저장한다
  • 우리 두 블록이 언제 호출되었는지
  • 관찰 발견: 코드 저장의 용도
  • 우리animations가 저장한 코드는 SBView의 위치를 바꾸는 데 사용된다.
  • 우리completion이 저장한 코드는 애니메이션이 완성된 후에 호출하는 데 사용됩니다.

  • 이 Block이 호출된 위치:
  • 우리animations가animation();에서 집행한
  • 우리의completion은 우리stop 방법으로 실행된다
  • 지금 문제가 생겼어요. 우리 애니메이션스는 원래 방법에서 집행했기 때문에 문제가 없어요.그러나, 우리의completion은 우리stop방법에서 실행하기 때문에 우리는stop에서completion을 실행해야 한다.
    그래서 해결 방법:
    우리들의completion을 공공 속성으로 만들다
    @property (nonatomic, copy) void(^completion)();
    

    그리고 우리가 정의한 방법에서 우리의 공공 속성에 값을 부여합니다. (이 방법의completion을 우리의 공공 속성에 부여합니다.)
    self.completion = completion;
    

    구체적인 위치는 잠시 후에 코드를 직접 쓰겠습니다
    마지막:stop 방법에서 우리completion을 실행합니다
    -(void)stop{
    
      self.completion();
    } 
    

    이렇게 하면 사용자 정의 애니메이션 재생이 완료됩니다.
    - (void)myAnimateWithDuration:(CGFloat)duration animations:(void(^)())animation completion:(void(^)())completion {
    
    [UIView beginAnimations: nil context: nil];
    [UIView setAnimationDuration: duration];
    [UIView setAnimationDidStopSelector:@seletor(stop)];
    
    self.completion = completion;
    animation();
    self.SBView.center = CGPointMake(100, 400);
    [UIView commitAnimations];
    

    만약 아직도 잘 모르겠다면, 내가 여기에서 인터넷에서 찾은 사진 한 장을 여러분께 보여 드리겠습니다.
    Snip20160422_1.png

    좋은 웹페이지 즐겨찾기