主线程处理问题

时间:2012-12-12 12:32:50

标签: ios multithreading ios5 uiview grand-central-dispatch

在我的应用程序中,我使用背景线程来执行多个服务并使用核心数据执行操作。我使用主线进行背景处理,工作正常。 这是我的代码

    dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_async(main, 
                   ^{ 
                       [self backGroundCall]; 
                   }); 

-(void)backGroundCall
{
   NSLog(@"Done");
        if([CacheManager refreshDBforFirstTimeUseWithDelegate:self])
       {
           [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"IsDBInitialized"];

            ContainerViewController *containerViewControllerInstance = [ContainerViewController getContainerInstance];
            [containerViewControllerInstance setUserId:_userID];

            [progressView setHidden:YES];
            [self.view setUserInteractionEnabled:YES];

            [self.navigationController setDelegate:containerViewControllerInstance];
            [self.navigationController pushViewController:containerViewControllerInstance animated:YES];
        }

}

初始化数据库后,我需要导航到容器视图。在初始化期间,我将显示一个进度条。当整个后台进程完成(app处于最小化状态)时,这工作正常。在后台进程中如果我到达前台进度条没有显示那时显示黑屏而不是进度视图。主威胁容器视图完成后,所有不显示[如果我来到主线程进程的前台]。

enter image description here

我需要显示进度条,如果我在主线程进程中回到应用程序。请指导我解决这个问题。

感谢。

1 个答案:

答案 0 :(得分:4)

   dispatch_queue_t main = dispatch_get_main_queue();
    dispatch_async(main, 
                   ^{ 
                       [self backGroundCall]; 
                   }); 

这有点误导......您调用方法backGroundCall,但实际上是在主线程上执行此操作。如果要在工作线程上进行某些操作,可以执行以下操作:

  // Declare the queue
         dispatch_queue_t workingQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
         dispatch_async(workingQueue,
                        ^{
                          // My background job
                            dispatch_async(dispatch_get_main_queue(),
                                           ^{
                                              // Update the UI
                                           }
                                           );
                        });