dispatch_sync和dispatch_async的區別

来源:http://www.cnblogs.com/jukaiit/archive/2017/12/11/8018941.html
-Advertisement-
Play Games

dispatch_sync 線程同步、dispatch_async線程非同步 比如 這些代碼輸出的結果是 1 2 3 4 依次輸出、無論你運行多少次都會是這一種結果 但是來看下麵的非同步呢? 輸出的結果是 1 2 3 4 隨機輸出、有時 2 1 3 4 有時 1 3 2 4 等 在iOS中是無法使用 d ...


dispatch_sync 線程同步、dispatch_async線程非同步

比如

   //同步
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 1");
    });
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 2");
    });
    
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 3");
    });
    
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_sync - 4");
    });

這些代碼輸出的結果是 1 2 3 4 依次輸出、無論你運行多少次都會是這一種結果

 

但是來看下麵的非同步呢?

//並行隊列、同步
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"1");
    });
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"2");
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"3");
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"4");
    });
    

輸出的結果是 1 2 3 4 隨機輸出、有時 2 1 3 4  有時  1 3 2 4 等

 

 

在iOS中是無法使用 dispatch_sync(dispatch_get_main_queue() 

原因如下:

在iOS使用 dispatch_sync(dispatch_get_main_queue()^(){block體});

dispath向主隊列加一個同步的block;

此時主隊列在等待    dispatch_sync(dispatch_get_main_queue(),^(){block體});執行

dispatch_sync在等待主隊列執行完畢。

所以在此過程中,我們最初調用的dispatch_sync函數一直得不到返回,main queue被阻塞,而我們的block又需要等待main queue來執行它。造成死鎖 

在iOS 使用主隊列 dispatch_get_main_queue() 時 應該使用非同步執行

dispatch_async(dispatch_get_main_queue(), ^(){

        NSLog(@"222");

   });

 

 

    dispatch_sync  :調用用    dispatch_sync的線程會等dispatch_sync的對內容執行完再繼續執行。

    dispatch_async :調用dispatch_async的線程不會的等dispatch_async的內容,自己繼續執行。

  sync/async的區別在於 調用diapatch的線程是否等待dispatch執行完。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ViewPager是v4支持庫中的一個控制項,相信幾乎所有接觸Android開發的人都對它不陌生。之所以還要在這裡翻舊賬,是因為我在最近的項目中有多個需求用到了它,覺得自己對它的認識不夠深刻。我計劃從最簡單的使用場景出發,記錄我到目前為止所對ViewPager的使用情況以及有關它的一些知識點。 這個系 ...
  • 首先自我介紹一下,本人鳥窩,現在就職於xx共用汽車,擔任主程,目前用的技術棧是.net core+angular。 今天我講的是關於ReactNative從零基礎開發,希望可以對入門的新手,起到一個指導作用。 目前學習React Native跨平臺開發的人員比較多,乾ReactNative開發的程式 ...
  • 這裡將為你詳細介紹占位符的使用,將其學以致用,可以達到簡化佈局文件,減少字元串資源量。 1、在資源文件中的使用。 打開資源文件中的strings.xml文件,進行編輯。如下圖所示: 圖 1.0 2、獲取字元串資源文件的使用說明。 方式一: 輸出的結果是:13.0得分:12.22 方式二: 輸出的結果 ...
  • 近日,Google在12月發佈的安卓系統安全公告中披露了一個名為“Janus”安卓漏洞(漏洞編號:CVE-2017-13156)。該漏洞可以讓攻擊者繞過安卓系統的signature scheme V1簽名機制,進而直接對App進行篡改。而且由於安卓系統的其他安全機制也是建立在簽名和校驗基礎之上,該漏 ...
  • xamarin上常用的崩潰分析工具有TestFlight,HockeyApp, Crashlytics等。TestFlight沒用過,Crashlytics註冊需要訪問Google,不好弄,HockeyApp走通了,步驟記錄如下: 1.配置HockeyApp 進入官網https://hockeyap ...
  • 在前面已經初步封裝了一個MVP的網路請求框架,那隻是個雛形,還有很多功能不完善,現在進一步進行封裝。添加了網路請求時的等待框,retrofit中添加了日誌列印攔截器,添加了token攔截器,並且對DataManager類進行了擴展,真正體現它的作用,並且對大量的重覆代碼做了一定封裝,減少代碼的冗餘。 ...
  • 25條提高iOS App性能的技巧和訣竅 當我們開發iOS應用時,好的性能對我們的App來說是很重要的。你的用戶也希望如此,但是如果你的app表現的反應遲鈍或者很慢也會傷害到你的審核。 然而,由於IOS設備的限制有時很難工作得很正確。我們開發時有很多需要我們記住這些容易忘記的決定對性能的影響。 這是 ...
  • 一旦攻擊者將植入惡意代碼的仿冒的App投放到安卓商店等第三方應用市場,就可替代原有的App,進行公開下載、更新。網友安裝這些仿冒App後,不僅會泄露個人賬號、密碼、照片、文件等隱私信息,手機更可能被植入木馬病毒,進而或導致手機被ROOT,甚至被遠程操控。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...