1. 程式人生 > >iOS開發-使用Runloop實現執行緒保活、執行緒常駐

iOS開發-使用Runloop實現執行緒保活、執行緒常駐

保證執行緒的長時間存活
在iOS開發過程中,有時一些花費時間比較長的操作阻塞主執行緒,導致介面卡頓,那麼我們就會建立一個子執行緒,然後把這些花費時間比較長的操作放在子執行緒中來處理。可是當子執行緒中的任務執行完畢後,子執行緒就會被銷燬掉。

首先,我們建立一個testThread類,繼承自NSThread,然後重寫dealloc 方法。


@interface testThread : NSThread

@end

@implementation testThread
- (void)dealloc
{
    NSLog(@"%s",__func__);
}
@end
- (void
)viewDidLoad { [super viewDidLoad]; // 測試執行緒 [self threadTest]; } - (void)threadTest { testThread *subThread = [[testThread alloc] initWithTarget:self selector:@selector(subThreadAction) object:nil]; [subThread start]; } - (void)subThreadAction { @autoreleasepool { NSLog
(@"%@----子執行緒任務開始",[NSThread currentThread]); [NSThread sleepForTimeInterval:2.0]; NSLog(@"%@----子執行緒任務結束",[NSThread currentThread]); } }

當子執行緒中的任務執行完畢後,執行緒就被立刻銷燬了。
如果程式中,需要經常在子執行緒中執行任務,頻繁的建立和銷燬執行緒,會造成資源的浪費。
這時候我們就可以使用RunLoop來讓該執行緒長時間存活而不被銷燬。

#import "SubViewController.h"
#import "testThread.h"
@interface SubViewController () @property(nonatomic,strong) testThread* ttThread; @end @implementation SubViewController - (void)viewDidLoad { [super viewDidLoad]; // 測試執行緒 [self threadTest]; } - (void)threadTest { testThread *subThread = [[testThread alloc] initWithTarget:self selector:@selector(subThreadEnter) object:nil]; [subThread setName:@"測試執行緒"]; [subThread start]; self.ttThread = subThread; } /** 子執行緒任務 */ - (void)subThreadAction { NSLog(@"啟動RunLoop後--%@",[NSRunLoop currentRunLoop].currentMode); NSLog(@"%@----子執行緒任務開始",[NSThread currentThread]); for (int i=0; i<300; i++) { [NSThread sleepForTimeInterval:1.0]; NSLog(@"----子執行緒任務 %ld",(long)i); } NSLog(@"%@----子執行緒任務結束",[NSThread currentThread]); } /** 子執行緒啟動後,啟動runloop */ - (void)subThreadEnter { @autoreleasepool { NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; //如果註釋了下面這一行,子執行緒中的任務並不能正常執行 [runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; NSLog(@"啟動RunLoop前--%@",runLoop.currentMode); [runLoop run]; } } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self performSelector:@selector(subThreadAction) onThread:self.ttThread withObject:nil waitUntilDone:NO]; } @end

1.獲取RunLoop只能使用 [NSRunLoop currentRunLoop] 或 [NSRunLoop mainRunLoop];
2.即使RunLoop開始執行,如果RunLoop 中的 modes 為空,或者要執行的mode裡沒有item,那麼RunLoop會直接在當前loop中返回,並進入睡眠狀態。
3.自己建立的Thread中的任務是在kCFRunLoopDefaultMode這個mode中執行的。
4.在子執行緒建立好後,最好所有的任務都放在AutoreleasePool中。

如果不執行下列語句:
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];

不執行.png

執行下列語句:
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];

執行後.png

可以看出我們添加了一個source0,這樣runloop才執行起來。

其實這個例子只是簡單製造一個常駐記憶體的執行緒,但是這個執行緒並不好控制結束,可以參考我的另外一篇文章iOS開發-RunLoop的退出方式

相關推薦

iOS開發-使用Runloop實現執行執行常駐

保證執行緒的長時間存活 在iOS開發過程中,有時一些花費時間比較長的操作阻塞主執行緒,導致介面卡頓,那麼我們就會建立一個子執行緒,然後把這些花費時間比較長的操作放在子執行緒中來處理。可是當子執行緒中的任務執行完畢後,子執行緒就會被銷燬掉。 首先,我們建立一

RunLoop六:在實際開發中的應用 之 控制執行生命週期(執行) 二

八、 停止 NSRunLoop 執行 上章提到了 ,只有控制器釋放了。執行緒沒有被釋放。這是因為 程式碼 卡在了 [[NSRunLoop currentRunLoop] run];這句程式碼. 任務執行完成後,執行緒會銷燬。但是 有 run 方法的話。代表系統一直在執行run

RunLoop六:在實際開發中的應用 之 控制執行生命週期(執行)

一、前言 OC 的程式設計師大多數用過的 AFNetwork 這個網路請求框架。這個框架中就使用了 RunLoop 技術,去控制子執行緒的生命週期。 相當於 它建立了一個子執行緒,這個子執行緒會一直都在記憶體中,不會死亡。當某個時間段需要子執行緒工作時,會告訴子執行緒需要做什麼?過一段時間,

Android Service執行

    Android 系統對於記憶體管理,為了使系統有序穩定的執行,系統內部會自動分配,控制程式的記憶體使用。當系統覺得記憶體的資源非常有限的時候,為了保證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體, 比如專案需求需要Service在後臺實時

安卓開發之使用雙程序守護和程序提權來實現服務程序

一、程序保活 在 如何讓我們的Android應用程序保活? 文章裡總結了一些程序保活方法,本文以雙程序守護和程序提權來保活我們的服務程序。 雙程序守護: 主要設計AB兩個不同服務程序,A程序的服務輪詢檢查B程序的服務是否存活,沒存活的話將其拉起,

玩轉iOS開發 - Runloop 具體解釋

img mar dsm ews down eas log ada 開發 Runloop 具體解釋

iOS開發HTTPS實現之信任SSL證書和自簽名證書

                                          &nb

iOS開發實現OC和Swift的混編

背景: 最近又開始看了一些關於Swift的視訊、部落格、書,發現swift相對於OC使用起來更簡潔了,於是就想在原有專案中引入swift。原有的專案都是使用OC寫的,既然要在原有專案中引入swift檔案首先就要實現OC和swift的混編設定。 混編設定:

iOS開發之第三方分享微信分享朋友圈分享,史上最新最全第三方分享微信方式實現朋友圈方式實現

微信分享前提:  1.需要成功在微信開發者平臺註冊了賬號, 並取的對應的 appkey appSecret。         2. 針對iOS9 添加了微信的白名單,以及設定了 scheme url 。 這都可以參照上面的連結,進行設定好。   3. 分享不跳轉的時

iOS開發怎樣實現全系統的文字複製貼上

在開發的過程中,我們有時候想要在A應用中複製一段文字,然後在B應用中貼上使用,這就需要使用到系統級的複製貼上功能了。在iOS中,實現全系統複製功能的程式碼其實很簡單: UIPasteboard *p

NDK實現後臺服務

現在的國產手機基本都是不能保證的 隨隨便便一殺就沒了 復活不了;我的華為P9就不行,其他的我覺得也夠嗆,但是使用公司自己得MTK5.0平臺, 那真是特嗎和病毒沒什麼區別。。。 我這是在騰訊課堂裡學習來得;動腦學院,挺好得一個學習android看視訊得

iOS開發 UI實現的三種動畫

一、首尾式動畫 程式碼示例: // beginAnimations表示此後的程式碼要“參與到”動畫中     [UIView beginAnimations:nil context:nil]; //設定動畫時長     [UIView setAni

Android雲巴整合第三方推送實現APP偽(小米篇)

此文只是講述如何使用雲巴自帶的包實現該功能,核心技術並不是博主寫的。此功能實現首先實現基礎的推送,沒有實現的請看SDK快速入門,實現了的可以直接去官方文件怎麼整合第三方,雲巴文件傳送門,那我為什麼要寫這篇博文,我是不會和你講的,進入正題: 1.新建專案

iOS開發實現圖片的打碼效果

    馬賽克(mosaic)作為人類進步路上的一大絆腳石,被人們所深惡痛絕。作為阻止人類進步小能手,我今天就給大家普及一下關於如何在iOS平臺實現圖片打碼效果的。 圖1、效果圖 本文主要介紹的是使用iOS平臺自身的API去實現圖片打碼效果的,沒有使用openCV。

iOS開發—Swift實現支付密碼彈窗

Swift實現支付密碼彈窗 輸入支付密碼彈窗簡單實現,類似支付寶。 主要程式碼檔案 popPayPwdView//支付密碼彈窗實現 CodeTextField//防止textField出

高效 實現長連線:手把手教你實現 自適應的心跳機制

以下內容轉載自http://blog.csdn.net/carson_ho/article/details/79522975前言當實現具備實時性需求時,我們一般會選擇長連線的通訊方式而在實現長連線方式時,存在很多效能問題,如 長連線保活今天,我將 手把手教大家實現自適應的心跳

iOS開發實現無限滑動

  在看到這個標題的時候,相信大家心裡肯定會想,無限迴圈輪播的部落格已經滿天飛了,好有必要寫麼。這裡我想宣告一下,這裡的無線滑動,但是資料卻不迴圈。 實現原理 由於業務的需求,需要有大量的資料呈現在collectionView上,但是又不想重新整理全部的

Java執行的建立執行的生命週期狀態

重新認識Java執行緒建立的三種方式:   繼承Thread類   1.通過繼承Thread類建立Thread子類,並重寫run方法。run方法的方法體表示執行緒類要完成的任務,因此也把run方法稱為執行體。 2.建立Thread子類的例項物件,就是建立了執行

執行組threadgroup執行池threadpool

基礎概念(百科) 在Java中每一個執行緒都歸屬於某個執行緒組管理的一員,例如在主函式main()主工作流程中產生一個執行緒,則產生的執行緒屬於main這個執行緒組管理的一員。簡單地說,執行緒組(ThreadGroup)就是由執行緒組成的管理執行緒的類,這個類是java.l

Android 程序,Service程序常駐

關於 Android 平臺的程序保活這一塊,想必是所有 Android 開發者矚目的內容之一。你到網上搜 Android 程序保活,可以搜出各種各樣神乎其技的做法,絕大多數都是極其不靠譜。前段時間,Github還出現了一個很火的“黑科技”程序保活庫,聲稱可以做到