Does dispatch_async(dispatch_get_main_queue(), ^{…}); wait until done?

后端 未结 8 1689
一整个雨季
一整个雨季 2020-11-28 20:45

I have a scenario in my app, where I want to do some time consuming task which consists of some data processing as well as UI update, in a method. My method looks like this,

8条回答
  •  孤城傲影
    2020-11-28 20:51

    OK, there are two ways of doing that:

    // GLOBAL_CONCURRENT_QUEUE
    
    
    - (void)doCalculationsAndUpdateUIsWith_GlobalQUEUE 
    {
        dispatch_queue_t globalConcurrentQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(globalConcurrentQ, ^{
    
           // DATA PROCESSING 1
           sleep(1);
           NSLog(@"Hello world chekpoint 1");
           dispatch_sync(dispatch_get_main_queue(), ^{
               // UI UPDATION 1
               sleep(1);
               NSLog(@"Hello world chekpoint 2");
           });
    
            /* the control to come here after UI UPDATION 1 */
            sleep(1);
            NSLog(@"Hello world chekpoint 3");
            // DATA PROCESSING 2
    
            dispatch_sync(dispatch_get_main_queue(), ^{
                // UI UPDATION 2
                sleep(1);
                NSLog(@"Hello world chekpoint 4");
            });
    
            /* the control to come here after UI UPDATION 2 */
            sleep(1);
            NSLog(@"Hello world chekpoint 5");
            // DATA PROCESSING 3
    
            dispatch_sync(dispatch_get_main_queue(), ^{
                // UI UPDATION 3
                sleep(1);
                NSLog(@"Hello world chekpoint 6");
            });
       });
    }
    
    
    
    // SERIAL QUEUE
    - (void)doCalculationsAndUpdateUIsWith_GlobalQUEUE 
    {
    
        dispatch_queue_t serialQ = dispatch_queue_create("com.example.MyQueue", NULL);
        dispatch_async(serialQ, ^{
    
           // DATA PROCESSING 1
           sleep(1);
           NSLog(@"Hello world chekpoint 1");
    
           dispatch_sync(dispatch_get_main_queue(), ^{
               // UI UPDATION 1
               sleep(1);
               NSLog(@"Hello world chekpoint 2");
           });
    
    
           sleep(1);
           NSLog(@"Hello world chekpoint 3");
           // DATA PROCESSING 2
    
           dispatch_sync(dispatch_get_main_queue(), ^{
               // UI UPDATION 2
               sleep(1);
               NSLog(@"Hello world chekpoint 4");
           });  
       });
    }
    

提交回复
热议问题