2013-10-08 6 views
0

내 앱에서 MBProgressHUD 라이브러리를 사용하고 있지만, 방대한 양의 데이터를 쿼리 할 때 진행 상황 표시가 표시되지 않는 경우가 있습니다. 데이터 처리가 완료됩니다 (그때까지 hud가 더 이상 표시되지 않아도 됨).iOS에서 NSThread와 autorealease 풀을 사용하는 효과적인 방법

다른 게시물에서 UI 실행주기가 너무 바빠서 완전히 새로 고쳐지지 않아서 문제가 부분적으로 해결 된 솔루션을 사용했음을 알았습니다. 이제 모든 요청이 HUD가 상승하지만 거의 절반이 앱 충돌 횟수. 왜? 그것이 도움이 필요한 곳입니다.

내가 대리자 방법 didSelectRowAtIndexPath에서이 코드가, 테이블 뷰가 : 난 그냥 전화를 다른 시점에서

- (void)showHUD { 
    @autoreleasepool { 
     [HUD show:YES]; 
    } 
} 

: 다음

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    [NSThread detachNewThreadSelector:@selector(showHUD) toTarget:self withObject:nil]; 
    ... 
} 

을, 나는이 방법이

[HUD hide:YES]; 

잘 작동하면 작동하고, 허드 쇼 (hud show)하고, 예상대로 사라집니다. d, 때로는 응용 프로그램이 충돌하는 경우가 있습니다. 오류 : EXC_BAD_ACCESS. 왜? 그런데

는 HUD 개체가 이미있는 viewDidLoad에 할당 : 그렇지 않으면 처리가 완료 될 때까지 MBProgressHud이되는 MBProgressHud 포인트, 그리기 차단

당신은 다른 스레드에서 처리를 수행 할 필요가
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ... 

    // Allocating HUD 
    HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view]; 
    [self.navigationController.view addSubview:HUD]; 

    HUD.labelText = @"Checking"; 
    HUD.detailsLabelText = @"Products"; 
    HUD.dimBackground = YES; 
} 
+0

메인 스레드에서도 처리하고 있습니까? – chedabob

+0

네, 일부 배열을 열거하고, 일부 객체를 채우고, 콜렉션 뷰에있는 것들을 표시합니다 ... 예, 모든 것이 메인 쓰레드에서 처리 된 것 같습니다 ... – Renexandro

답변

0

, 다시 숨겨져 있습니다.

NSThread는 프로세싱을 오프로드하기에는 너무 낮은 레벨입니다. Grand Central Dispatch 또는 NSOperationQueue를 제안합니다.

http://jeffreysambells.com/2013/03/01/asynchronous-operations-in-ios-with-grand-central-dispatch http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

/* Prepare the UI before the processing starts (i.e. show MBProgressHud) */ 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    /* Processing here */ 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     /* Update the UI here (i.e. hide MBProgressHud, etc..) */  
    }); 
}); 

이 조각은 다른 스레드로 처리를 파견하기 전에, 주 스레드에서 모든 UI 작업을 할 수있게된다. 그런 다음 처리가 완료되면 주 스레드로 돌아가 UI를 업데이트 할 수 있습니다.

+0

그러나 처리는 델리게이트 메소드입니다 , didSelectRowAtIndexPath이 경우 다른 스레드에서이 처리를 수행하려면 어떻게해야합니까? MBProgress Show 및 Process는 didSelect 내부에 있습니다 ... 어떻게 그들을 다른 스레드에서 분리 할 수 ​​있습니까? – Renexandro

+0

didSelectRowAtIndexPath에 코드 스 니펫을 붙여 넣습니다. 어떻게 작동하는지 명확하게 답변을 업데이트했습니다. – chedabob

+0

Nop, 작동하지 않습니다. 즉, hud가 나타나고 작업이 완료된 후에 모든 것 ... 다른 아이디어가 있습니까? – Renexandro