GCD應該是iOS開發中最多見的多線程使用方法.數據結構
1 dispatch_sync(queue, block)//同步提交
1 dispatch_async (queue, block)// 異步提交
1 dispatch_after(time, queue, block)// 同步延遲提交
其中第一個參數類型是dispatch_queue_t,就是一個表示隊列的數據結構 typedef struct dispatch_queue_s *dispatch_queue_t;多線程
block就是表示任務的Block typedef void (^dispatch_block_t)( void);異步
dispatch_async函數是異步非阻塞的,調用後會馬上返回,工做由系統在線程池中分配線程去執行工做。 dispatch_sync和dispatch_after是阻塞式的,會一直等到添加的工做完成後纔會返回。async
ViewController.hide
1 #import <UIKit/UIKit.h> 2 3 @interface MainViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> 4 5 6 @property(nonatomic,retain)UITableView *table; 7 @property(nonatomic,copy)NSArray *arr; 8 9 @end
ViewController.m函數
1 #import "MainViewController.h" 2 3 @interface MainViewController () 4 5 @end 6 7 @implementation MainViewController 8 9 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 10 { 11 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 12 if (self) { 13 // Custom initialization 14 } 15 return self; 16 } 17 18 - (void)viewDidLoad 19 { 20 [super viewDidLoad]; 21 // Do any additional setup after loading the view. 22 NSURL *url1 = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201302/07/20130207172119_HJP8F.jpeg"]; 23 NSURL *url2 = [NSURL URLWithString:@"http://img1.gamersky.com/image2013/01/20130111y_4/image003_wm.jpg"]; 24 _arr = [NSArray arrayWithObjects:url1,url2, nil]; 25 26 _table = [[UITableView alloc]initWithFrame:CGRectMake(0, 20, 320, 400)]; 27 _table.delegate = self; 28 _table.dataSource = self; 29 [self.view addSubview:_table]; 30 } 31 32 - (void)didReceiveMemoryWarning 33 { 34 [super didReceiveMemoryWarning]; 35 // Dispose of any resources that can be recreated. 36 } 37 38 39 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 40 return 1; 41 } 42 43 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 44 return [_arr count]; 45 } 46 47 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 48 static NSString *identifier = @"identifier"; 49 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 50 if (cell == nil) { 51 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 52 } 53 54 // 開始執行隊列,第1個參數表示將任務交給誰來處理,第2個爲函數體,表示你要作的事情 55 //將一些耗時的工做添加到全局隊列,讓系統分配線程去作, 56 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 57 58 NSData *data = [NSData dataWithContentsOfURL:[_arr objectAtIndex:[indexPath row]]]; 59 UIImage *img = [UIImage imageWithData:data]; 60 //工做完成後再次調用GCD的主線程隊列去完成UI相關的工做,這樣作就不會由於大量的非UI相關工做加劇主線程負擔,從而加快UI事件響應。 61 dispatch_async(dispatch_get_main_queue(), ^{ 62 cell.imageView.image = img; 63 }); 64 65 }); 66 return cell; 67 } 68 @end
繼續挖個坑。。。準備重寫T.Tui