GCD에서 자주 사용하는 함수

2577 단어
주 스레드가 하는 일은 사용자의 입력, 이벤트 처리, UI 업데이트에 응답하는 것이다. 그러나 소모된 작업은 주 스레드에서 처리하지 마라. 소모된 작업으로 인해 주 스레드가 막혀서 사용자의 요구에 제때에 응답하지 못한다.
주 스레드가 막히는 문제를 해결하기 위해서, 이 시간을 소모하는 임무를 다른 스레드에 맡겨 처리할 수 있다
CPU 싱글 코어 시대에 멀티스레드 기술을 사용하여 동시 처리를 할 수 있다. GCD는 비동기적인 방법으로 멀티 코어 CPU를 위한 동시 처리 기술이다.
URL을 통해 UIImage 대상을 직접 만들 수 없습니다. NSData 대상을 구축해야 합니다. URL에서 요청한 바이너리 데이터 대상이고, UIImage 대상을 만들고 UIImage 대상을 UIImageView의 이미지 속성에 값을 부여해야 합니다.
NSThread 는 다중 스레드 클래스이지만, 스레드 생성, 스레드 통신, 스레드 폐기 등 우리가 스레드를 관리해야 하기 때문에 매우 번거롭다
GCD는 C 언어 수준의 API로 C 함수를 제공합니다.GCD 코드는 간단하며 멀티 코어 CPU 처리를 지원합니다.
GCD에서 매우 중요한 개념은 발송 대기열이다. 발송 대기열은 하나의 대상이다. 이것은 임무를 받아들일 수 있고 임무를 먼저 집행하는 순서로 집행할 수 있다. 발송 대기열은 병렬적이거나 직렬적일 수 있다.동시 대기열은 한 번에 하나의 작업만 수행할 수 있는 여러 작업을 동시에 수행할 수 있습니다.
  • 직렬 대기열은 보통 특정한 자원에 동기화하여 접근하는 데 사용되며, 매번 하나의 작업만 수행할 수 있으며, C 언어 함수dispatch 를 사용합니다queue_create 생성
  • 동시 발송 대기열도 전역 발송 대기열이라고 하는데 한 개 이상의 작업을 동시에 수행할 수 있고 우선순위를 설정할 수 있다.dispatch 호출get_global_queue(DISPATCH QUEUE PRIORITY DEFAULT, 0) 이 C 언어 함수는 병렬 대기열 대상을 획득
  • 메인 팀은 응용 프로그램의 메인 라인에 열거되어 있으며 UI 인터페이스를 업데이트할 수 있습니다. 다른 두 대기열은 UI를 업데이트할 수 없습니다. dispatch 를 사용합니다.get_main_queue 함수는 홈 열을 획득할 수 있습니다
  • -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event    {
        self.imageView.image = nil;
        NSURL *imgURL = [NSURL URLWithString:@"http://www.baidu.com..."];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *imgData = [NSData dataWithContentsOfURL:imgURL];
            UIImage *img = [UIImage imageWithData:imgData];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.imageView.image = img;
            });
        });
    }
    

    위 코드에서 dispatchasync 함수는 비동기적으로 작업을 수행하는 데 사용되지만, 직렬 대기열에서 동기화됩니다.
    dispatch_async(dispatch_get_main_queue(), ^{
                self.imageView.image = img;
            });
    

    위 코드는 홈 팀 열에서 UI 업데이트
    iOS의 일반적인 지연 시간은
  • NSObject 호출 방법
  • [self performSelector:@selector( ) withObject:( ) afterDelay:2.0];
    
  • GCD로 지연
  • -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event    {
        NSLog(@"Start");
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(/* */  *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 
        });
    }
    

    GCD는 딜레이를 하는 것이 매우 편리하고 유연하다. 딜레이를 할 때 다시 메인 라인으로 돌아가 일을 할 수도 있고 딜레이를 할 수도 있다.
  • GCD는 프로그램 전체 수명 주기에 한 번만 코드가 실행되도록 보장합니다
  •  static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
           // 
        });
    

    좋은 웹페이지 즐겨찾기