2017-03-01 66 views
-1

,因爲我們知道main_queue是串行queue.There沒有真正的異步。主隊列中沒有異步?

- (void)someMethod{ 
    dispatch_async(dispatch_get_main_queue(),^{ 
    NSLog(@"main_async invoke"); 
    }); 
    NSLog(@"method invoke"); 
} 

上面的代碼「方法調用」「main_async援引」前會寫。因爲在main_queue沒有真正的異步。但代碼箱可以SAI NO:

- (void)someMethod{ 
    __block BOOL flag=YES; 
     NSBlockOperation *blockOperation = [NSBlockOperation  blockOperationWithBlock:^{ 
       NSLog(@"blockOperation invoke"); 
       [NSThread sleepForTimeInterval:4]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
          NSLog(@"main_async invoke"); 
          flag=NO; 
       }); 
     }]; 
     [blockOperation start]; 
     while (flag) { 
       [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.5]]; 
     } 
     NSLog(@"method invoke"); 
    } 

上面的代碼「方法來調用」會後「main_async援引」被寫 我認爲這是因爲「RunLoop'.Is的有誰能解釋這是爲什麼?

+0

你是什麼意思「真正的異步」?在你的第一個例子中,這個塊是異步執行的。正如你指出的那樣,主隊列是一個串行隊列,並且由於任務沒有被搶佔,該塊將在當前方法返回後的一段時間纔會執行,但它仍然是異步的。也許你的意思是並行執行,並且這不會發生在任何串行隊列上。 – Paulw11

+0

我可以理解第一個例子。我的問題是爲什麼在第二個例子中,'NSLog(@「main_async invoke」)'在'NSLog(@「method invoke」)之前執行。當前方法返回後的一段時間。在第二個示例中,塊在當前方法返回之前執行。 – DoradoIs90

+0

因爲在第二個塊中,您正在直接啓動操作。您未將其提交給操作隊列以供稍後執行。 – Paulw11

回答

0

有主線程上運行async在主線程和sync之間的差異。 sync基本上是指,現在就做,async的意思是,在主線上​​做,但不一定在這個時刻。

0

是否有任何人能解釋這是爲什麼?

因爲它是async - 異步。這就是異步意味着。它意味着「稍後」。

您的代碼的[blockOperation start];到方法的結束後進行轉發。只有這樣主線程才能被釋放。所以只有這樣,主線程上的異步塊纔有機會進入並執行。

+0

有關。解釋'dispatch_async'中的async或sync同樣適用於'dispatch_async'調用,而不是隊列本身,區別在於'dispatch_sync'等待塊被執行,其中'dispatch_async'不執行。 –