iOS - dispatch_after解說

来源:https://www.cnblogs.com/jiuyi/archive/2018/12/20/10150572.html
-Advertisement-
Play Games

dispatch_after 是來延遲執行的GCD方法,因為在主線程中我們不能用sleep來延遲方法的調用,所以用dispatch_after是最合適的 dispatch_after 能讓我們添加進隊列的任務延時執行,該函數並不是在指定時間後執行處理,而只是在指定時間追加處理到dispatch_qu ...


dispatch_after 是來延遲執行的GCD方法,因為在主線程中我們不能用sleep來延遲方法的調用,所以用dispatch_after是最合適的

dispatch_after 能讓我們添加進隊列的任務延時執行,該函數並不是在指定時間後執行處理,而只是在指定時間追加處理到dispatch_queue

GCD是Grand Central Dispatch的縮寫,是蘋果對多核硬體上執行併發代碼的一種支持。

它有以下優點:

  • GCD通過把計算密集型任務放於後臺運行,以此提高APP的響應速度。
  • GCD提供了更簡單的併發模型,它優於線程鎖,並且幫助你避免併發bug。
  • GCD基於底層、高性能的優化常規類型的代碼,例如單例。
//該方法的第一個參數是 time,第二個參數是 dispatch_queue,第三個參數是要執行的block。
//在主線程中延遲執行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  //Your code... });

 

特別註意 : 上面這句 dispatch_after 的真正含義是在6秒後把任務添加進隊列中,並不是表示在6秒後執行,大部分情況該函數能達到我們的預期,只有在對時間要求非常精準的情況下才可能會出現問題。

 

參數dispatch_time_t解析

 

dispatch_time_t 有兩種形式的構造方式,第一種相對時間:通過 dispatch_time 函數。第二種是絕對時間,通過 dispatch_walltime 函數來獲取,其需要使用一個 timespec 的結構體來得到dispatch_time_t

dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)

//DISPATCH_TIME_NOW 表示現在,NSEC_PER_SEC 表示的是秒數,它還提供了 NSEC_PER_MSEC 表示毫秒
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC);   //10s 之後‘執行’(也就是上面說的加入到隊列中)

dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)

//要使用一個 timespec 的結構體
dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)
dispatch_time_t time_w = dispatch_walltime(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);

NSLog(@"——————————————————————————");
    //在主線程中延遲執行
dispatch_after(time_w, dispatch_get_main_queue(), ^{
   NSLog(@"=======================");
});

 

解析dispatch_timedispatch_walltime

dispatch_time stops running when your computer goes to sleep. dispatch_walltime continues running. So if you want to do an action in one hour minutes, but after 5 minutes your computer goes to sleep for 50 minutes, dispatch_walltime will execute an hour from now, 5 minutes after the computer wakes up. dispatch_time will execute after the computer is running for an hour, that is 55 minutes after it wakes up.


dispatch_time 得到的時間長度是相對的,與設備 running 時間相關,即設備運行時才計時;而 dispatch_walltime 設定的時間段是絕對的,與設備是否running無關;


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

-Advertisement-
Play Games
更多相關文章
  • 關於oracle database link,使用database link相關的查詢語句是否會開啟事務呢?我們知道,在資料庫中一個簡單的SELECT查詢語句不會產生事務(select for update會產生事務)。如下測試所示: 我們首先準備測試環境,創建了一個database link: L... ...
  • http://www.cnblogs.com/yijiaming/p/9684601.html 方法一: 1、需要安裝pymssql pip install pymssql 2、使用方法: 方法二: 1、安裝必要的組件: pip install django-sqlserver django-pyt ...
  • 公眾號:SAP Technical 本文作者:matinal 原文出處:http://www.cnblogs.com/SAPmatinal/ 原文鏈接:【HANA系列】SAP HANA XS使用Data Services查詢CDS實體【一】 前言部分 使用SAP HANA XS數據服務(XSDS)庫 ...
  • 今天不瘦給大家分享一下redis第二個基本數據類型:列表。如果大家瞭解基本數據結構,相信大家對列表不會陌生,比如在C語言中我們可以使用數組實現一個列表,也可以使用鏈表實現一個列表(列錶鏈表傻傻分不清楚,列表是一種抽象數據類型,鏈表為一種實現方式)。 言歸正傳,那redis是怎麼實現列表的呢?答案是: ...
  • 本文簡述在Android開發中Intent的常見應用,僅供學習分享使用。 ...
  • 介紹 幾乎在所有平臺上都有很多進程運行背景,它們被稱為服務。可能在Android平臺中有一些服務可以執行長時間運行的操作,這些操作在處理時不需要用戶交互。 在本文中,藉助預定義的Android警報服務,我們將創建一個應用程式,在所需的時間間隔內將電話模式更改為振動模式。除此之外,我們將編寫自己的Se ...
  • 一、獲取UiDevice設備信息 二、獲取Bundle的相關信息 NSLocal獲取本地化數據: ...
  • 一、理解 利用GLKBaseEffect,自定義頂點著色器和片元著色器,結合天空盒子,展示效果 二、技術代碼 CCSkyBoxEffect:天空盒子效果類; CCSkyboxShader.vsh:頂點著色器; CCSkyboxShader.fsh:片元著色器; //立方體場景貼圖紋理處理及頂點數據處 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...