成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS多線程編程之NSThread的使用

移動開發 iOS
本文直觀的為大家介紹了iOS開發中的多線程編程技術,再分析各種方式的優缺點,并順理成章的引出了NSTread的使用等等具體內容,解釋的非常詳盡,希望對大家有所幫助。

1、簡介:

1.1 iOS有三種多線程編程的技術,分別是: 

1.、NSThread

2、Cocoa NSOperation (iOS多線程編程之NSOperation和NSOperationQueue的使用) 

3、GCD  全稱:Grand Central Dispatch( iOS多線程編程之Grand Central Dispatch(GCD)介紹和使用) 

這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。 

這篇我們主要介紹和使用NSThread,后面會繼續2、3 的講解和使用。 

1.2 三種方式的優缺點介紹: 

NSThread: 

優點:NSThread 比其他兩個輕量級 

缺點:需要自己管理線程的生命周期,線程同步。線程同步對數據的加鎖會有一定的系統開銷 

NSThread實現的技術有下面三種: 

Cocoa threads

POSIX threads

Multiprocessing Services

一般使用cocoa thread 技術。

Cocoa operation 

優點:不需要關心線程管理,數據同步的事情,可以把精力放在自己需要執行的操作上。 

Cocoa operation 相 關的類是 NSOperation ,NSOperationQueue。NSOperation是個抽象類,使用它必須用它的子類,可以實現它或者使用 它定義好的兩個子類:NSInvocationOperation 和 NSBlockOperation。創建NSOperation子類的對象,把對 象添加到NSOperationQueue隊列里執行。 

GCD

Grand Central Dispatch (GCD) 是Apple開發的一個多核編程的解決方法。在iOS4.0開始之后才能使用。GCD是一個替代諸如 NSThread, NSOperationQueue, NSInvocationOperation等技術的很高效和強大的技術。現在的iOS系統都 升級到6了,所以不用擔心該技術不能使用。 

介紹完這三種多線程編程方式,我們這篇先介紹NSThread的使用。 

2、NSThread的使用 

2.1 NSThread 有兩種直接創建方式: 

 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 

 + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument 

第一個是實例方法,第二個是類方法 

  1. [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil]; 
  2. NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:)  object:nil];  
  3. [myThread start]; 

2.2參數的意義: 

selector :線程執行的方法,這個selector只能有一個參數,而且不能有返回值。 

target  :selector消息發送的對象 

argument:傳輸給target的唯一參數,也可以是nil 

第一種方式會直接創建線程并且開始運行線程,第二種方式是先創建線程對象,然后再運行線程操作,在運行線程操作前可以設置線程的優先級等線程信息 

2.3 PS:不顯式創建線程的方法: 

用NSObject的類方法  performSelectorInBackground:withObject: 創建一個線程:

  1. [Obj performSelectorInBackground:@selector(doSomething) withObject:nil];  

2.4 下載圖片的例子: 

2.4.1  新建singeView app 

新建項目,并在xib文件上放置一個imageView控件。按住control鍵拖到viewController.h文件中創建imageView IBOutlet  ViewController.m中實現: 

  1. //  ViewController.m    
  2. //  NSThreadDemo    
  3. //    
  4. //  Created by rongfzh on 12-9-23.    
  5. //  Copyright (c) 2012年 rongfzh. All rights reserved.    
  6. //    
  7. #import "ViewController.h"    
  8. #define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"    
  9. @interface ViewController ()    
  10. @end    
  11. @implementation ViewController    
  12. d)downloadImage:(NSString *) url{    
  13.     NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];    
  14.     UIImage *image = [[UIImage alloc]initWithData:data];    
  15.     if(image == nil){    
  16.     }else{    
  17.         [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];    
  18.     }    
  19. }    
  20. d)updateUI:(UIImage*) image{    
  21.     self.imageView.image = image;    
  22. }    
  23. - (void)viewDidLoad    
  24. {    
  25.     [super viewDidLoad];    
  26. //    [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];    
  27.     NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];    
  28.     [thread start];    
  29. }    
  30. - (void)didReceiveMemoryWarning    
  31. {    
  32.     [super didReceiveMemoryWarning];    
  33.     // Dispose of any resources that can be recreated.    
  34. }    
  35. @end    

2.4.2線程間通訊 

線程下載完圖片后怎么通知主線程更新界面呢? 

  1. [selfperformSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES]; 

performSelectorOnMainThread是NSObject的方法,除了可以更新主線程的數據外,還可以更新其他線程的比如:

用:performSelector:onThread:withObject:waitUntilDone:  

運行下載圖片:

圖片下載下來了。 

2.3 線程同步 

我們演示一個經典的賣票的例子來講NSThread的線程同步: 

 .h 

  1. #import <UIKit/UIKit.h>    
  2. @class ViewController;    
  3. @interface AppDelegate : UIResponder <UIApplicationDelegate>    
  4. {    
  5.     int tickets;    
  6.     int count;    
  7.     NSThread* ticketsThreadone;    
  8.     NSThread* ticketsThreadtwo;    
  9.     NSCondition* ticketsCondition;   
  10.     NSLock *theLock;    
  11. }    
  12. @property (strong, nonatomic) UIWindow *window;    
  13. @property (strong, nonatomic) ViewController *viewController;    
  14. @end    

 

 

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions    
  2.      {    
  3.          tickets = 100;    
  4.          count = 0;    
  5.          theLock = [[NSLock alloc] init];    
  6.          // 鎖對象    
  7.          ticketsCondition = [[NSCondition alloc] init];    
  8.          ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];    
  9.          [ticketsThreadone setName:@"Thread-1"];    
  10.          [ticketsThreadone start];    
  11.          ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];    
  12.          [ticketsThreadtwo setName:@"Thread-2"];    
  13.          [ticketsThreadtwo start];    
  14.          self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    
  15.          // Override point for customization after application launch.    
  16.          self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];    
  17.          self.window.rootViewController = self.viewController;    
  18.          [self.window makeKeyAndVisible];    
  19.          return YES;    
  20.      }    
  21.      - (void)run{    
  22.          while (TRUE) {    
  23.              // 上鎖    
  24.      //        [ticketsCondition lock];    
  25.              [theLock lock];    
  26.              if(tickets >= 0){    
  27.                  [NSThread sleepForTimeInterval:0.09];    
  28.                  count = 100 - tickets;    
  29.                  NSLog(@"當前票數是:%d,售出:%d,線程名:%@",tickets,count,[[NSThread currentThread] name]);    
  30.                  tickets--;    
  31.              }else{    
  32.                  break;    
  33.              }    
  34.              [theLock unlock];    
  35.      //        [ticketsCondition unlock];    
  36.          }    
  37.      }    

如果沒有線程同步的lock,賣票數可能是-1.加上lock之后線程同步保證了數據的正確性。
上面例子我使用了兩種鎖,一種NSCondition ,一種是:NSLock。 NSCondition我已經注釋了。

線程的順序執行 

他們都可以通過 

[ticketsConditionsignal]; 發送信號的方式,在一個線程喚醒另外一個線程的等待。

比如:

  1. #import "AppDelegate.h"    
  2. #import "ViewController.h"    
  3. @implementation AppDelegate    
  4. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions    
  5.  {    
  6.      tickets = 100;    
  7.      count = 0;    
  8.      theLock = [[NSLock alloc] init];    
  9.      // 鎖對象    
  10.      ticketsCondition = [[NSCondition alloc] init];    
  11.      ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];    
  12.      [ticketsThreadone setName:@"Thread-1"];    
  13.      [ticketsThreadone start];    
  14.      ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];    
  15.      [ticketsThreadtwo setName:@"Thread-2"];    
  16.      [ticketsThreadtwo start];    
  17.      NSThread *ticketsThreadthree = [[NSThread alloc] initWithTarget:self selector:@selector(run3) object:nil];    
  18.      [ticketsThreadthree setName:@"Thread-3"];    
  19.      [ticketsThreadthree start];        
  20.      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    
  21.  
  22.      // Override point for customization after application launch.    
  23.      self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];    
  24.      self.window.rootViewController = self.viewController;    
  25.      [self.window makeKeyAndVisible];    
  26.      return YES;    
  27.  }    
  28.  -(void)run3{    
  29.      while (YES) {    
  30.          [ticketsCondition lock];    
  31.          [NSThread sleepForTimeInterval:3];    
  32.          [ticketsCondition signal];    
  33.          [ticketsCondition unlock];    
  34.      }   
  35.  }    
  36.  - (void)run{    
  37.      while (TRUE) {    
  38.          // 上鎖    
  39.          [ticketsCondition lock];    
  40.          [ticketsCondition wait];    
  41.          [theLock lock];    
  42.          if(tickets >= 0){    
  43.              [NSThread sleepForTimeInterval:0.09];    
  44.              count = 100 - tickets;    
  45.              NSLog(@"當前票數是:%d,售出:%d,線程名:%@",tickets,count,[[NSThread currentThread] name]);    
  46.              tickets--;    
  47.          }else{    
  48.              break;    
  49.          }    
  50.          [theLock unlock];    
  51.          [ticketsCondition unlock];    
  52.      }    
  53.  }    

wait是等待,我加了一個 線程3 去喚醒其他兩個線程鎖中的wait

其他同步

我們可以使用指令@synchronized來簡化 NSLock的使用,這樣我們就不必顯示編寫創建NSLock,加鎖并解鎖相關代碼。

  1. - (void)doSomeThing:(id)anObj 
  2.     @synchronized(anObj) 
  3.     { 
  4.         // Everything between the braces is protected by the@synchronizeddirective. 
  5.     } 


還有其他的一些鎖對象,比如:循環鎖NSRecursiveLock,條件鎖NSConditionLock,分布式鎖NSDistributedLock等等,可以自己看官方文檔學習 

NSThread下載圖片的例子代碼:http://download.csdn.net/detail/totogo2010/4591149

 

責任編輯:閆佳明 來源: oschina
相關推薦

2016-04-12 09:48:24

nsthread多線程ios

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2021-02-25 15:58:46

C++線程編程開發技術

2021-03-05 07:38:52

C++線程編程開發技術

2013-08-21 16:17:09

iPhone多線程

2009-06-17 11:23:00

Java多線程

2013-07-15 15:35:06

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2013-07-16 10:57:34

iOS多線程多線程概念多線程入門

2021-12-26 18:22:30

Java線程多線程

2014-05-08 10:39:55

Python并發編程

2010-01-21 11:25:44

linux多線程線程資源

2023-06-16 08:36:25

多線程編程數據競爭

2013-07-16 13:39:11

2013-07-16 11:38:46

iOS多線程多線程概念GCD

2024-01-07 17:29:10

編程語言線程Rust

2009-12-08 12:14:43

2010-03-16 17:16:38

Java多線程

2023-06-13 13:39:00

多線程異步編程

2009-03-12 10:52:43

Java線程多線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久精品视频 | 日日操操 | 男人天堂99 | 国产精品久久一区 | 日本韩国欧美在线观看 | 成人九区| 精品视频在线免费观看 | 久久久成人一区二区免费影院 | 黑人一级黄色大片 | 久久久久久国产 | 看片国产 | 中文字幕亚洲欧美日韩在线不卡 | 午夜视频在线免费观看 | 欧美视频免费在线 | 成人精品一区二区三区 | 国产日韩一区二区三免费 | 久久成人国产精品 | 午夜精品一区二区三区免费视频 | 一区二区三区网站 | 一区二区三区国产好 | 日本在线免费 | 一级片免费视频 | 中文字幕一区在线 | 性高朝久久久久久久3小时 av一区二区三区四区 | 91传媒在线观看 | 99热在线播放 | 黑人性hd | 亚洲精品在线看 | 性欧美精品一区二区三区在线播放 | 在线欧美视频 | 欧美精品一区在线发布 | 日韩 国产 在线 | 91成人精品视频 | 日韩欧美在| 亚洲在线免费 | 亚洲成人av | 国产成人精品一区二 | 久久久久久国产精品 | 日韩精品一区二区不卡 | 成年人精品视频在线观看 | 午夜精品一区二区三区在线视频 |