iOS 여러 개의 탄 상자 순서대로 팝 업 효과 구현

4460 단어 iOS탄 틀
가끔 은 이러한 수요 가 있 습 니 다.App 이 실행 되 고 RootVC 를 불 러 옵 니 다.이 때 는 업데이트 확인 등 작업 을 해 야 합 니 다.이 럴 때 는 2 개,심지어 여러 개의 탄 틀 이 순서대로 튀 어 나 와 야 할 수도 있다.
이 글 은 시스템 의 UIAlertController 를 예 로 들 것 입 니 다.물론 사용자 정의 라면 이 글 에서 여러 개의 팝 업 창 을 어떻게 처리 하 는 지 살 펴 봐 야 합 니 다.
우선,다음 과 같은 기본 표기 법 에 따른다 면:

- (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"  1" message:@"     " preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:nil]];
 [self presentViewController:alert animated:YES completion:nil];

 UIAlertController *alert2 = [UIAlertController alertControllerWithTitle:@"  2" message:@"     " preferredStyle:UIAlertControllerStyleAlert];
 [alert2 addAction:[UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:nil]];
 [self presentViewController:alert2 animated:YES completion:nil];
}
무슨 문제 가 있 을까요?콘 솔 조심 하 세 요.출력 이 분명 합 니 다.
Warning: Attempt to present   on which is already presenting
그 러 니까 두 번 째 탄 자 는 볼 수 없 을 거 야.
다른 경우 사용자 정의 Alert 라면 add 를 window 의 하위 보기 로 하고 두 번 째 탄 상 자 를 첫 번 째 위 에 덮 습 니 다.만약 네가 털 유리 배경 을 사용 했다 면 효과 가 더욱 뚜렷 해 질 것 이다.안 어 울 릴 거 야.
그래서 정확 한 해결 방법 은 자 물 쇠 를 채 우 는 과정 과 비슷 하 다.첫 번 째 탄 틀 의 어떤 단 추 를 누 른 후에 두 번 째 탄 틀 을 꺼 내 서 서 류 를 말한다.
여기 서 나 는 신 호 량 으로 해결 하고 싶 지만 신 호 량 이 스 레 드 를 막 아서 메 인 스 레 드 에서 직접 사용 할 수 없다.그래서 우 리 는 하위 스 레 드 에서 신 호 량 을 제어 하고 메 인 스 레 드 에서 Alert 를 만 들 고 표시 하 며 코드 를 직접 올 려 야 합 니 다.

- (void)viewDidAppear:(BOOL)animated {
 [super viewDidAppear:animated];
 //      ,       ,         
 dispatch_queue_t queue = dispatch_queue_create("com.se7en.alert", DISPATCH_QUEUE_SERIAL);
 dispatch_async(queue, ^{
 //       0    
 dispatch_semaphore_t sema = dispatch_semaphore_create(0);
 //     ,UI      ,     
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"  1" message:@"     " preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 //  Alert    ,        。
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });

 //      ,  ,              
 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
 //            ,      Alert
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"  2" message:@"     " preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });

 //  ,     Alert
 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
 dispatch_async(dispatch_get_main_queue(), ^{
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"  3" message:@"     " preferredStyle:UIAlertControllerStyleAlert];
 [alert addAction:[UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
 dispatch_semaphore_signal(sema);
 }]];
 [self presentViewController:alert animated:YES completion:nil];
 });
 });
}
이렇게 되면 우리 의 요 구 를 실현 할 수 있다.
주의해 야 할 것 은 여기 서 왜 전역 병렬 대기 열 을 사용 하지 않 는 지 하 는 것 입 니 다.주로 신 호 량 이 스 레 드 를 막 을 수 있 고 우선 순위 가 매우 높 습 니 다.만약 에 이때 대기 열 에 임무 가 있다 면 신호 가 촉발 되 기 를 기다 릴 것 입 니 다.물론 일부러 그 러 는 사람 도 있다.'탄 틀 이 튀 어 나 오 는 시간 에는 다른 어떤 일 도 하지 마라'는 수요 가 적절 하 다.물론 우 리 는 절대 메 인 스 레 드 를 막 아 서 는 안 된다!
우 리 는 비동기 스 레 드 에서 신 호 를 기다 리 고 메 인 스 레 드 에서 신 호 를 보 내 면 두 스 레 드 의 동기 화 를 실현 할 수 있다.사실 신 호 량 은 일종 의 자물쇠 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기