NSThread 線程基礎問題

首先介紹一下關于線程的兩個關鍵詞
進程: 進程是進程實體的運行過程.是系統進行資源分配和調度的一個獨立單位
線程: 線程是進程的執行單位
為了更好地讓程序執行 iOS下采用多線程的機制 在程序運行時 多個線程同時進行 可以分擔主線程的壓力 提高程序運行效率 但是注意一個問題 雖然多線程可以提高一定的效率 但是也不能無限制的創建 會消耗系統資源 合理的線程數目在5個左右
一般需要開辟線程的操作: 圖片渲染 大數據存儲 網絡請求

我們做關于線程相關的操作會用到NSThread這個類

  1. 獲取當前線程
    NSThread *thread = [NSThread currentThread];
    NSLog(@"%@", thread);
    (打印出來的內容:<NSThread: 0x7f9729f09fb0>{number = 1, name = main} number: 線程編號 name: 線程名 我們創建出來的子線程都是沒有名字的 線程有name這個屬性 我們可以給線程取名字 主線程名字默認"main")
  2. 給線程取名字
    thread.name = @"sec";
  3. 創建一個子線程
    [NSThread detachNewThreadSelector:@selector(newThread) toTarget:self withObject:nil];
    (這是一個類調用的方法來創建一個子線程 在iOS10.0中還有一個block類方法創建)
  4. 線程優先級
    double p = [thread threadPriority];
    NSLog(@"%lf", p);
    (線程的優先級默認為0.5 而且所有線程的優先級都默認為0.5)
  5. // 判斷當前線程是否為主線程
    [NSThread isMainThread]; // 類方法判斷 [thread isMainThread]; // 對象方法判斷 // 無6. 論在哪 直接獲取主線程
    [NSThread mainThread];
  6. // 初始化方法創建一個線程 創建的這個線程必須要啟動才能使用
    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(createOneThread) object:nil];
    [thread1 start];
  7. 延時(延時操作是NSThread的類調用的方法, [NSThread sleepForTimeInterval:5]這個也是一個延時方法)
  • (void)createOneThread {
    // 給線程設置延時操作 (運行之后5s該線程再進行操作)
    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:5]; [NSThread sleepUntilDate:date];
    NSLog(@"我們 我們");
    }

下面我們來舉一個運用多線程的例子:
我們讓一個imageView加載一張網絡圖片(對于這個問題 加載圖片的操作級應該拿到子線程中進行 但是一定要注意 我們給imageView賦值的操作要在主線程中進行)

[NSThread detachNewThreadSelector:@selector(newThread) toTarget:self withObject:nil];

  • (void)newThread {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    [self performSelectorOnMainThread:@selector(getMain:) withObject:data waitUntilDone:YES];
    }

  • (void)getMain:(id)object {
    self.picImageView.image = [UIImage imageWithData:object];
    }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容