iphone開發-nsrunloop概述和原理
1.什麼是nsrunloop?
什麼是nsrunloop呢?根據大眾化的理解,nsrunloop就是一種訊息處理機制,但是我理解為在程式執行時建立對訊息的一種對執行緒的監聽迴圈,讓執行緒在有訊息接收時處理訊息,沒有就進入睡眠,避免占用過多的記憶體,這也為多執行緒的處理成為可能。
2.利用nsrunloop阻塞nsoperation執行緒
這裡主要介紹一下使用nsrunloop阻塞執行緒。
主要使用在nstimer定時啟用的任務或者非同步獲取資料的情況如socket獲取網路資料,要阻塞執行緒,直到獲取資料之後在釋放執行緒。
下面是執行緒中沒有使用nsrunloop阻塞執行緒的**和執行效果:
在mytask.h檔案裡:
#import
@inte***ce mytask : nsoperation
@end
在mytask.m檔案裡:
#import "mytask.h"
@implementation mytask
- (void)main
#pragma previous function:
- (void)main
- (void)handletime:(id)sender
- (void)dealloc
@end
在你的檢視控制器的viewdidload方法裡新增如下**:
- (void)viewdidload
執行結果為:
2015-05-18 11:43:27.574 examplefornsrunloop[1816:53652] 開始執行緒=
2015-05-18 11:43:27.574 examplefornsrunloop[1816:53651] 開始執行緒=
2015-05-18 11:43:27.575 examplefornsrunloop[1816:53658] 開始執行緒=
2015-05-18 11:43:37.477 examplefornsrunloop[1816:53658] delloc mytask=
2015-05-18 11:43:37.484 examplefornsrunloop[1816:53652] delloc mytask=
2015-05-18 11:43:37.484 examplefornsrunloop[1816:53651] delloc mytask=
為什麼並沒有執行定時器裡的方法就將mytask釋放了呢?因為程式在執行完main方法裡的內容之後就將mytask物件釋放掉了,而此時nstimer還要等待2秒才會執行,因此我們需要乙個有效「延遲」程式的東西,等待nstimer執行完之後才釋放掉這個物件,因此我們就用到了nsrunloop:
在mytask.m中增加成員變數和while迴圈,並改寫handletime:方法:
@implementation mytask
#pragma updated function
- (void)main}
- (void)handletime:(id)sender
此時列印結果為:
2015-05-18 11:57:29.648 examplefornsrunloop[1925:57701] 開始執行緒=
2015-05-18 11:57:29.650 examplefornsrunloop[1925:57700] 開始執行緒=
2015-05-18 11:57:29.652 examplefornsrunloop[1925:57699] 開始執行緒=
2015-05-18 11:57:31.657 examplefornsrunloop[1925:57700] 執行了nstimer
2015-05-18 11:57:31.658 examplefornsrunloop[1925:57700] delloc mytask=
2015-05-18 11:57:31.658 examplefornsrunloop[1925:57701] 執行了nstimer
2015-05-18 11:57:31.659 examplefornsrunloop[1925:57701] delloc mytask=
2015-05-18 11:57:31.659 examplefornsrunloop[1925:57699] 執行了nstimer
2015-05-18 11:57:31.660 examplefornsrunloop[1925:57699] delloc mytask=
因為while迴圈是在子執行緒中進行的,並不會阻塞主線程,所以既可以實現等待nstimer執行完釋放物件的效果,又能讓主線程繼續執行.
NSRunLoop概述和原理
1.什麼是nsrunloop?我們會經常看到這樣的 1 2 3 4 5 6 7 8 9 10 ibaction start id sender progress sethidden yes 2.nsrunloop工作原理 接下來看一下nsrunloop具體的工作原理,首先是官方文件提供的說法,看圖 ...
NSRunLoop概述和原理
1.什麼是nsrunloop?我們會經常看到這樣的 1 2 3 4 5 6 7 8 9 10 ibaction start id sender progress sethidden yes 2.nsrunloop工作原理 接下來看一下nsrunloop具體的工作原理,首先是官方文件提供的說法,看圖 ...
NSRunLoop 概述和原理
1.什麼是nsrunloop?我們會經常看到這樣的 ibaction start id sender progress sethidden yes 這段 很神奇的,因為他會 暫停 執行,而且程式執行不會因為這裡有乙個while迴圈而受到影響。在 progress sethidden no 執行之後,...