NSThread

NSThread 是輕量級(jí)的多線程開發(fā)曲管,使用并不復(fù)雜,但使用NSThread需要自己管理線程的聲明周期粱胜。

1.線程與進(jìn)程的關(guān)系

1. 線程是CPU執(zhí)行任務(wù)的基本單位烛占,一個(gè)進(jìn)程能有多個(gè)線程,但同時(shí)只能執(zhí)行一個(gè)任務(wù)
2. 進(jìn)程就是運(yùn)行中的軟件胁出,是動(dòng)態(tài)的
3. 一個(gè)操作系統(tǒng)可以對(duì)應(yīng)多個(gè)進(jìn)程型型,一個(gè)進(jìn)程可以有多條線程,但至少有一個(gè)線程
4. 同一個(gè)進(jìn)程內(nèi)的線程共享進(jìn)程里的資源

2. 主線程

1. 進(jìn)程一啟動(dòng)就自動(dòng)創(chuàng)建
2. 顯示和刷新UI界面
3. 處理UI事件

3. 子線程

1. 處理耗時(shí)的操作
2. 子線程不能用來(lái)刷新UI

NSThread開辟線程的兩種方式

    /*
     *1.創(chuàng)建手動(dòng)開啟方式

     * target: 信息發(fā)送者
    
     * selector: 方法選擇器選擇一個(gè)方法
     
     * object: 如果上面選擇的方法有參數(shù)全蝶,則object便是這個(gè)方法的參數(shù)
     */
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(thread:) object:@"thread"];
    // 開啟線程
    [thread start];


    /*
     *2.創(chuàng)建并自動(dòng)開啟方法
     */
    [NSThread detachNewThreadSelector:@selector(thread1:) toTarget:self withObject:@"thread1"];

下面是 多線程加載一張圖片 實(shí)例



#import "AppDelegate.h"
#import "ViewController.h"

@interface AppDelegate ()
{
    UIViewController *VC;
}
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
    VC = [[UIViewController alloc]init];
    
    VC.view.backgroundColor = [UIColor whiteColor];
    
    VC.title = @"NSThread";
    
    self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:VC];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    
    button.frame = CGRectMake(100, 200, 0,0);
    
    [button setTitle:@"多線程加載一張圖片" forState:UIControlStateNormal];
    
    [button sizeToFit];
    
    [VC.view addSubview:button1];
    
    [button addTarget:self action:@selector(clickBtn1) forControlEvents:UIControlEventTouchUpInside];
     [button1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    

 return YES;
}

- (void)clickBtn1{
    
    [VC.navigationController pushViewController:[ViewController new] animated:YES];
}
}

Viewcontroller.m

#import "ViewController.h"

#define kUrl @"http://store.storeimages.cdn-apple.com/8748/as-images.apple.com/is/image/AppleInc/aos/published/images/s/38/s38ga/rdgd/s38ga-rdgd-sel-201601?wid=848&hei=848&fmt=jpeg&qlt=80&op_sharpen=0&resMode=bicub&op_usm=0.5,0.5,0,0&iccEmbed=0&layer=comp&.v=1454777389943"

@interface ViewController ()
{
    UIImageView *imageView;
    NSThread *thread;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"多線程加載一張圖片";
    self.edgesForExtendedLayout = UIRectEdgeNone;

    
    // 1闹蒜、在self.view上放一個(gè)UIImageView試圖
     
    imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];
    [self.view addSubview:imageView];
    
    
    
     //2、 開辟一條子線程(我這里采用創(chuàng)建并手動(dòng)開啟線程的方式)
      thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage) object:nil];
    
    //給線程起名字
    thread.name = @"子線程";
    
    // 開啟線程
    [thread start];
    
    
    
}

/*
 * 3抑淫、 在`子線程`中將url圖片轉(zhuǎn)成image對(duì)象
 
 *  downloadImage該方法的參數(shù)取決于創(chuàng)建線程時(shí)傳給object的參數(shù)
 
 */
- (void)downloadImage{
    
    
    //將圖片的url地址轉(zhuǎn)化為data對(duì)象
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kUrl]];
    
    //將data對(duì)象轉(zhuǎn)化為image對(duì)象
    UIImage *image = [UIImage imageWithData:data];
    
    //采用睡眠方式模擬1秒網(wǎng)絡(luò)延遲
//    [NSThread sleepForTimeInterval:20];
    
    /* 
     * 4. 回到主線程
     
     * 方法updataUI將在主線程中執(zhí)行
     
     * withObject:updateUI的參數(shù)
     
     * waitUntilDone: 設(shè)為YES绷落,會(huì)阻塞當(dāng)前子線程,去主線程執(zhí)行updateUI方法始苇,也就是更新UI砌烁,直到UI更新完畢。設(shè)為NO,意味著在主線程updateUI方法執(zhí)行到一半時(shí)可能會(huì)被打斷去做其他線程的工作催式,也就是說(shuō)我主線程的UI還沒有顯示完就程序就跳出了主線程函喉。
     */
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
    
    
    /*
     
     * 查看打印結(jié)果
     
     * number = 1 :線程的編號(hào),由系統(tǒng)設(shè)置荣月,主線程的編號(hào)為1
     
     * name = main:指當(dāng)前所在的線程的名字叫做main,可以自己設(shè)置管呵,主線程的名字默認(rèn)是main,其他線程如果不給他設(shè)置名字默認(rèn)是nil
     
     */
    NSLog(@"downlaodImage方法所在的線程 = %@",[NSThread currentThread]);
}

/*
 * 5喉童、 在主線程中將image對(duì)象給UIImageView試圖
 */

- (void)updateUI:(UIImage *)image{
    
    imageView.image = image;
    
    NSLog(@"downlaodImage方法所在的線程 = %@",[NSThread currentThread]);
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [thread start];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撇寞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堂氯,更是在濱河造成了極大的恐慌蔑担,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽白,死亡現(xiàn)場(chǎng)離奇詭異啤握,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晶框,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門排抬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人授段,你說(shuō)我怎么就攤上這事蹲蒲。” “怎么了侵贵?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵届搁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)卡睦,這世上最難降的妖魔是什么宴胧? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮表锻,結(jié)果婚禮上恕齐,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬逊,他們只是感情好显歧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著码耐,像睡著了一般追迟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骚腥,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天敦间,我揣著相機(jī)與錄音,去河邊找鬼束铭。 笑死廓块,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的契沫。 我是一名探鬼主播带猴,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懈万!你這毒婦竟也來(lái)了拴清?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤会通,失蹤者是張志新(化名)和其女友劉穎口予,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涕侈,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沪停,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裳涛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片木张。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖端三,靈堂內(nèi)的尸體忽然破棺而出舷礼,到底是詐尸還是另有隱情,我是刑警寧澤郊闯,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布且轨,位于F島的核電站浮声,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旋奢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一然痊、第九天 我趴在偏房一處隱蔽的房頂上張望至朗。 院中可真熱鬧,春花似錦剧浸、人聲如沸锹引。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嫌变。三九已至,卻和暖如春躬它,著一層夾襖步出監(jiān)牢的瞬間腾啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工冯吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘待,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓组贺,卻偏偏與公主長(zhǎng)得像凸舵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子失尖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容