2013-01-06 2 views
1

GCD를 배우려고하기 때문에 아직 어떻게 작동하는지 완전히 파악하지 못했습니다. 어떤 이유로, 다음 메소드를 호출 한 후 프레임 속도가 영구적으로 떨어집니다. 디스패치 기능을 사용하지 않고 메인 루프에 데이터를 쓰면 프레임 속도는 60으로 유지됩니다. 이유는 모르겠습니다.dispatch_async 및 프레임 속도

-(void)saveDataFile { 


     _hud = [MBProgressHUD showHUDAddedTo:self.parentView animated:YES]; 
     _hud.labelText = NSLocalizedString(@"Saving data...", nil); 


     dispatch_queue_t myQueue = dispatch_queue_create("myQueueName", NULL); 


     dispatch_async(myQueue, ^(void) { 

      @autoreleasepool { 

       id data = [self.model getData]; 
       if (data != nil) { 

        NSString *filePath = @"myPath"; 
        [data writeToFile:filePath atomically:YES]; 
       } 

      } 


      dispatch_async(dispatch_get_main_queue(), ^(void) { 

       [_hud hide:YES]; 

      }); 

     }); 


    } 
+0

대기열을 만드는 것은 비용이 많이 드는 작업이므로 부담해야 할 때마다해야한다고 생각합니다. 대신 대기열을 생성하고 인스턴스에 대한 참조를 유지하거나 분명히 백그라운드에서 실행하려고하므로 기존 전역 대기열 중 하나 (디스패치_get_global_queue)를 우선 순위에 따라 전달하십시오. \ [EDIT \] 그냥 * 영구적 인 드롭 읽기, 나는 왜 당신이 영구적 인 프레임 속도 드롭을 얻을지 모르겠다. 그래도 반복적으로'dispatch_queue_create '를 호출하지 않는 것이 좋습니다. – zneak

+0

문제가 발생한 후 문제가 HUD와 관련이있는 것 같습니다. 이러한 전화를 꺼내면 프레임 속도가 떨어지지 않습니다. 내가 잘못 구현해야합니다. 그 수업을 자세히 들여다 보러 갈거야. – anna

답변

1

해결. 나는이 질문에서 HUD의 구현을 따랐다 : MBProgressHUD not showing

기본적으로 HUD를 단순히 숨기기보다는 제거해야한다. 그렇지 않으면 HUD 애니메이션이 계속 보이고 나에게 보이지 않으므로 프레임 속도가 떨어집니다.

-(void)saveDataFile { 


// create HUD and add to view 
    MBProgressHUD *hud = [[MBProgressHUD alloc]initWithView:self.parentView]; 
    hud.labelText = NSLocalizedString(@"Saving data...", nil); 
    hud.delegate = self; 
    [self.parentView addSubview:hud]; 


// define block for saving data 

     void (^saveData)() = ^() { 

      @autoreleasepool { 

       id data = [self.model getData]; 
       if (data != nil) { 

        NSString *filePath = @"myPath"; 
        [data writeToFile:filePath atomically:YES]; 
       } 

      } 

} 


// use HUD convenience method to run block on a background thread 
[hud showAnimated:YES whileExecutingBlock:saveData]; 


    } 


// remove hud when done! 
// 
- (void)hudWasHidden:(MBProgressHUD *)hud { 

    [hud removeFromSuperview]; 
}