objective-c GCD

  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

相關文章
相關標籤/搜索