iOS 개발 진급 제11장 GCD

2404 단어
GCD 소개:
GCD(Grand Central Dispatch)는 MacOS 10.6(눈표범)에서 처음 출시되었고 iOS4에 도입되었다.0중.GCD는 NSThread, NSOperationQueue, NSInvocation Operation 등 다른 다중 스레드 기술 방안과 비교하면 사용하기에 더욱 편리하다.
- 위에서 발췌한 iOS 개발 진급
본고는 서적 《iOS개발진급》의 제11장에 대한 총결이다.
11.1
탕교는 여기서 예를 들었다. 웹 페이지를 다운로드하는 기능, 백엔드 다운로드, 웹 페이지에 loding 효과가 나타나고 다운로드가 끝난 후에 인터페이스에 불러와서 나타난다.
  • NSInvocation Operation 사용:
  • 방법1: 스레드 만들기
  • 방법2: 라인에서 다운로드 기능
  • 메서드3: 다운로드가 완료되면 마스터 스레드로 돌아가 UI 인터페이스 업데이트
  • 이것은 논리에 아무런 문제가 없는데 왜 책에 있는 코드가 MRC인가!!!형, 이거 언제 코드야?
    저자는 상기 방법을 사용하여 다운로드 기능을 완성하는데 모두 세 가지 방법이 있는데 코드가 흩어지고 읽을 수 없다고 비난했다.
    (구체적인 코드는 책으로 보시고 iOS AC 커뮤니티 53774852에 가입하여 PDF를 얻으신 것을 환영합니다)
    그런 다음 작성자는 GCD를 사용하여 동일한 기능을 수행합니다.
  • GCD를 사용한 구현
  • dispatch_async 성명 루틴
  • GCD 스레드 블록에서 다운로드
  • 다운로드가 완료되면 GCD로 주 스레드 업데이트 UI
  • 로 돌아갑니다.
    (구체적인 코드는 책으로 보시고 iOS AC 커뮤니티 53774852에 가입하여 PDF를 얻으신 것을 환영합니다)
    사실 논리상 두 가지 방식이 모두 똑같다. 그리고 GCD의 코드가 더욱 집중되고 코드의 양도 줄어들기 때문에 저자는 GCD 코드를 사용하는 논리적 관계가 더욱 명확해진다는 것을 얻었다.
    GCD의 관점: GCD의 장점은 코드가 더욱 집중되는 데 있다. 그러나 나는 논리적으로 더 분명하다고 생각하지 않는다. 왜냐하면 블록에 블록을 끼워 넣는 것은 코드로 볼 때 우아하지 않고 다중 블록을 끼워 넣을 때 변수, 메모리에 대한 관리도 큰 도전이다.StrongX는 오히려 이 예에서 NSOperationQueue를 사용하면 논리적으로 더욱 명확해질 수 있다고 생각한다.
    11.2
    11.2.1 —11.2.3
    이 부분에서 GCD와 Block을 간단하게 소개했습니다. 범상치 않게 말씀드리자면 좋은 점이 없습니다. 이 글을 읽어보시기 바랍니다. GCD의 사용은 저를 보면 충분합니다. 이 글에서 GCD를 더욱 상세하게 묘사했는데 정말 완벽합니다.
    11.2.4 백그라운드 실행
    사용자가 홈 버튼을 누르면 앱은 수면 상태로 들어간다. 그러나 때때로 우리는 백엔드에 들어갈 때 데이터를 처리해야 한다. 예를 들어 데이터를 업로드하고 저장하는 등이다.
    그러면 이때beginBackgroundTaskWithExpirationHandler를 사용하여 최대 10분의 백그라운드 주류 시간을 신청할 수 있습니다. (그중에 Block이 나왔어요. 어? 이 장은 GCD 아닌가요?)
    코드 로직은 다음과 같습니다.
    
    @property (nonatomic, assign) UIBackgroundTaskIdentifier beginTask; //        
    -(void)beginBGTask{
         _beginTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
                                            [self endBGTask];   
                                    }];
    } 
    -(void)endBGTask{
         [[UIApplication sharedApplication] endBackgroundTask:_beginTask];
         self.beginTask = UIBackgroundTaskInvalid;
    }
    -(void)myBGTask{ 
    //          
    //          [self endBGTask];       。
    }
    - (void)applicationDidEnterBackground:(UIApplication *)application {
           [self beginBGTask]; //            
           [self myBGTask]; //      
    }
    
    

    기사 더 보기
    iOS AC 그룹에 오신 것을 환영합니다. 537774852

    좋은 웹페이지 즐겨찾기