iOS Block 알림, 원클릭 스킨케어 기능

4592 단어
요구 사항:
  • 예를 들어 우리 원키 스킨케어 기능
  • 글꼴을 원클릭으로 전환할 때
  • 이런 종류는 모두 하나의 동작을 집행하는 데 속하고 통지를 보내는 것과 같다.

  • 모델 클래스를 먼저 정의합니다. 전체 코드 #import "BlockManager.h" 헤더 파일 정의 부분을 익히겠습니다.
    #import 
    typedef  void  (^CallBlock)(NSString * string);
    
    
    @interface BlockManager : NSObject
    @property (nonatomic,strong) NSString * userName;
    @property (nonatomic,copy) CallBlock  block;
    @property (nonatomic,strong) NSMutableArray * blockArray;
    
    - (void)mutiBlockWith:(CallBlock)call;
    
    @end
    
    
    #import "BlockManager.m"클래스에서의 실현 코드
    #import "BlockManager.h"
    
    @implementation BlockManager
    - (void)mutiBlockWith:(CallBlock)call{
        self.block = [call copy];
        [self.blockArray addObject:self.block];  
    }
    - (void)setUserName:(NSString *)userName{
        for (CallBlock block in self.blockArray) {
            if (block) {
                block(userName);      
            }
        }   
    }
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            self.blockArray = [NSMutableArray array];     
        }
        return self;
    }
    @end
    
    

    block: 우리는 패키지 함수, 익명 함수, 코드 블록이라고 부른다.block, 내가 비교적 즐겨 쓰는 리셋 함수, 왜냐하면 그는 이미 충분하기 때문이다
  • 천천히 분석해 봅시다. typedef void (^CallBlock)(NSString * string); 사용자 정의 블록 typedef-> 사용자 정의 내용void-> 블록 반환값(^CallBclok)-> 블록 이름은 우리의 방법명에 해당합니다. 사실 실제 호출은 이사 지침에 따라 호출됩니다. ^->하나의 Block 메소드 표시(NSString * string): 인삼과 같습니다. 여기에 여러 개의 매개 변수를 쓸 수 있는 매개 변수를 썼습니다.
  • 우리는 Block이 속성을 통해 접근하는 속성을 정의했다@property (nonatomic,copy) CallBlock block;.일반적으로 ARC 메커니즘에서 Block은 copy
  • 를 사용합니다
  • 우리는 BlockManager에서 개수조@property (nonatomic,strong) NSMutableArray * blockArray;를 정의했는데 왜 수조를 정의합니까? 여기에 어떤 작용이 있습니까?우리는copy의 작용이 새로운 대상을 복제하여 새로운 메모리 주소로 들어가는 것을 알고 인용 계수가 증가할 수 있음을 알고 있다. 우리copy는 사실 코드 블록이다. 우리는 모든 코드 블록에 하나의 표준 공간을 주고 우리는 그룹으로 모든 Block 블록을 저장하여 우리가 호출할 때 모두 호출할 수 있도록 한다.

  • 토론: 이거 대리님이랑 비슷하지 않아요?[self respondsToSelector:@selector()] 에이전트는 일반적으로 응답 함수를 사용하는데 사실은 밑바닥 원리와 마찬가지로 대응하는 함수 바늘을 찾고 우리가 호출하는 것은 함수 바늘이다.만약에 우리가 대응하는 지침을 호출했다면 대응하는 방법이나 Block은 반드시 호출될 것이다. 일부 학생들은 Block이 리셋을 받지 못할 수도 있다. 사실은 대응하는 이사 지침이 호출을 받지 못했다. 모두가 아무리 공부를 해도 원리를 알아야 문제를 해결하는 사고방식이 매우 빠르다.
  • 사용자 정의 구성원 방법- (void)mutiBlockWith:(CallBlock)call; 우리는 Block이 있는 구성원 방법을 정의했다. 우리는 이 방법을 여러 번 사용했는데 그 내부는 다음과 같다.
  • - (void)mutiBlockWith:(CallBlock)call{
       self.block = [call copy];
       [self.blockArray addObject:self.block];  
    }
    

    여기에서 우리는 수조를 통해 우리가 호출한 모든 Block을 수조에 넣었다. 틀림없이 위의 것은 이미 알고 있을 것이다
  • 그럼 우리 Block 함수는 언제 호출됩니까
  • - (void)setUserName:(NSString *)userName{
      for (CallBlock block in self.blockArray) {
          if (block) {
              block(userName); 
                     }
               }  
         }
    

    속성의 setter 방법을 사용하여 Block을 호출한다고 가정한 다음 다음을 살펴보겠습니다.
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        BlockManager * block = [[BlockManager alloc]init];
        
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"111");
        }];
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"22");
        }];
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"33");
        }];
        block.userName = @"lala";
       
    }
    

    사실 사용은 매우 간단하다. 단지 Block은 사실 우리가 통지한 것처럼 전체 프로젝트에서 호출될 수 있다는 것을 알려줄 뿐이다.콘솔 인쇄 결과는 다음과 같습니다.
    2016-03-07 22:23:34.299 BlockTest[57023:2003321] 111
    2016-03-07 22:23:34.302 BlockTest[57023:2003321] 22
    2016-03-07 22:23:34.304 BlockTest[57023:2003321] 33
    

    만약 우리가 코드를 수정한다면:
        BlockManager * block = [[BlockManager alloc]init];
         block.userName = @"lala";
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"111");
        }];
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"22");
        }];
        [block mutiBlockWith:^(NSString *string) {
            NSLog(@"33");
        }];
    
    

    우리가 본 것은 속성을 위에 올려놓고 다시 실행하는 것입니다. 컨트롤러에 출력이 없습니다.
    질문: 왜 Block 내부의 출력을 받지 못합니까?
    세심한 프로그램 원숭이는 당신의 호출 블록이 속성을 설정한setter 방법 내부에서 호출된 것을 발견할 수 있습니다. 코드가 실행될 때 컴파일 순서에 따라 실행되었기 때문에 당시의 블록은 메모리에 복사되지 않았기 때문에 이 때 블록 블록을 호출하지 않았습니다. 이 문제는 자신의 블록이 왜 실행되지 않았는지 알 수 있을 것입니다.
    오늘 이 조작은 여기까지 하겠습니다. 다음에 다중도 업로드에 대한 질문을 하겠습니다. 어떻게 라인을 사용자 정의하여 우리의 다중도 업로드 사고방식을 실현합니까?
    주: 문장이 만약 잘못된 점이 있다면 더욱 잘 이해하기 위해 바로잡아 주시기 바랍니다.여기에 임시로 작은 토론방을 만들었습니다. QQ:375940898도 업무 중의 문제를 함께 토론할 수 있습니다.

    좋은 웹페이지 즐겨찾기