[iOS學習筆記]runloop runMode方法調研

来源:http://www.cnblogs.com/afluy/archive/2016/05/31/5545446.html
-Advertisement-
Play Games

運行結果列印: 原文文檔介紹: Runs the loop once, blocking for input in the specified mode until a given date. //執行loop一次,堵塞等待給定模式的輸入直至給定的時間點 Parameters mode The mo ...


 
//
//  ViewController.m
//  ThreadTest
//
//  Created by skyko on 16/5/31.
//  Copyright © 2016年 helios. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSThread *thread;

@property (nonatomic, assign) BOOL isAlive;

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    self.isAlive = YES;
    
    self.thread = [[NSThread alloc] initWithTarget:self
                                          selector:@selector(workThread:)
                                            object:nil];
    [self.thread setName:@"MyCustomThread"];
    [self.thread start];

    //延遲3s後向線程添加任務
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_main_queue(), ^{
        [self performSelector:@selector(handleSomeThing)
                     onThread:self.thread
                   withObject:nil
                waitUntilDone:NO];
    });
}


- (void)workThread:(id)data {
    NSLog(@"workThread");
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];//不添加這一行的話,在有任務添加前下麵的while迴圈會一直執行,原因見後面解釋
    
    while (_isAlive) { //isAlive用於控制該線程的運行周期,當設置isAlive為NO時,該線程執行完當前任務後退出並銷毀
        NSLog(@"--->");
        //在設置的時間內執行NSDefaultRunLoopMode模式的任務
        //如果隊列中暫時沒有任務會一直堵塞直至有任務進入隊列
        //任務執行完成後接著迴圈
        //超時會進入下一次迴圈
        [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        NSLog(@"<---");
    }
}

- (void)handleSomeThing {
    NSLog(@"handleSomeThing before sleep");
    [NSThread sleepForTimeInterval:1.0f];
    NSLog(@"handleSomeThing after sleep");
}

@end

 

運行結果列印:

2016-05-31 11:42:25.020 ThreadTest[1940:76011] viewDidLoad
2016-05-31 11:42:25.020 ThreadTest[1940:76221] workThread
2016-05-31 11:42:25.021 ThreadTest[1940:76221] --->
2016-05-31 11:42:28.311 ThreadTest[1940:76221] handleSomeThing before sleep
2016-05-31 11:42:29.315 ThreadTest[1940:76221] handleSomeThing after sleep
2016-05-31 11:42:29.315 ThreadTest[1940:76221] <---
2016-05-31 11:42:29.315 ThreadTest[1940:76221] --->

 

原文文檔介紹:

Runs the loop once, blocking for input in the specified mode until a given date.

//執行loop一次,堵塞等待給定模式的輸入直至給定的時間點

Parameters

mode

The mode in which to run. You may specify custom modes or use one of the modes listed in Run Loop Modes.

limitDate

The date until which to block.

Return Value

YES if the run loop ran and processed an input source or if the specified timeout value was reached; otherwise, NO if the run loop could not be started.

//當runloop正在運行並處理了一個輸入源或者超時返回YES,否則如果runloop並未啟動就返回NO

 

Discussion

If no input sources or timers are attached to the run loop, this method exits immediately and returns NO; otherwise, it returns after either the first input source is processed or limitDate is reached. Manually removing all known input sources and timers from the run loop does not guarantee that the run loop will exit immediately. OS X may install and remove additional input sources as needed to process requests targeted at the receiver’s thread. Those sources could therefore prevent the run loop from exiting.

 如果沒有一個輸入源或者timer添加到runloop中,該方法會立刻退出並返回NO(這就是上面demo中添加下麵代碼的原因),否則該方法會在執行完隊列中第一個輸入源或超時後返回,手動移除runloop中所有輸入源和timer並不能保證runloop立刻退出.OS X系統可能線上程中添加或移除一些額外的輸入源來處理必須的任務,因此這些輸入源可能會阻止runloop的退出.

[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];


NOTE

A timer is not considered an input source and may fire multiple times while waiting for this method to return

timer不是一個輸入源並且可能在等待該方法返回過程中會多次啟動

 

總結:

[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
1.在設置的時間內執行設置的模式的任務
2.如果隊列中暫時沒有任務會一直堵塞直至有任務進入隊列
3.任務執行完成後該方法退出
4.超時後該方法退出
 

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

-Advertisement-
Play Games
更多相關文章
  • 跳轉系統設置界面,例如提示用戶打開定位、藍牙或者WIFI,提醒用戶打開推送或者位置許可權等 在iOS6之後,第三方應用需要跳轉系統設置界面,需要在URL type中添加一個prefs值,如下圖: 跳轉系統設置根目錄中的項目使用下麵的方法 1 _array = @[ 2 @{@"系統設置":@"pref ...
  • 這應該是這個系列最後一篇了。我寫了很多都不是很好,不過如果不寫,那就永遠寫不好。歡迎大家交流糾錯。 UIMenuController,它不像Alert那麼不友好,也不像ActionSheet,一定要點擊一下;你可以無視它的出現,也可以通過它調用一些設定好的方法。它就長這樣: 這個控制項是不是很熟悉,微 ...
  • 錯誤0: 描述:"pod don't forget to anonymize any private data"。 對於這個問題最好的解決就是對cocoapods進行升級或者重新安裝。 參考: pod install returning error 錯誤1:在對cocoapods進行更新時會提示存在 ...
  • 1:解決CocoaPods安裝時報的問題,http://ruby.taobao.org/latest_specs.4.8.gz 報404 解決 bad response Not Found 404 (http://ruby.taobao.org/latest_specs.4.8.gz) 原因:淘寶停 ...
  • 類型例子NSLog chars char 'a', '\n' %c short int — %hi, %hx, %ho unsigned short int %hu, %hx, %ho int 12, -97, 0xFFE0, 0177 %i, %x, %o unsigned int 12u, 10 ...
  • 1. 界面美觀 1.1. 主題 1.2. 改Project面板大小 2. 快捷鍵 2.1智能提示 2.2常用快捷鍵 3.編輯器調整 3.1 代碼提示忽略大小寫 3.2 顯示行號 3.3 優化自動導入 3.3 關閉啟動IDEA自動打開項目 1. 界面美觀 1.1. 主題 1.2. 改Project面板 ...
  • Fragment 裡面 使用輕量級的數據存儲sharepreference ,代碼思路清晰。保存輸入框裡面的數據,實現按鈕保存。 個人項目中簡單清晰代碼: 趙存檔 編寫 ,可以參考: 類繼承Fragment實現點擊事件: 本代碼來源個人博客:http://www.cnblogs.com/xiaobo ...
  • 現在開始寫博客,分享android開發中的心得。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...