GCD

GCD大神的總結

Apple inc

1. 關於Block

  void (^loggerBlock)(void);   // 聲明一個Block   
loggerBlock =^{  
//add your code  
} ; 

2、關於變量 
在block中可以使用定義程序塊可以訪問的變量,但此時Block中的變量只是定義程序塊可以訪問的變量的一個COPY ,若要共享定義程序塊可以訪問的變量,此時需要使用__block關鍵字對變量進行修飾,如: __block NSString *firstResult;  

3,使用dispatch_group_async把block加入到隊列中運行
 dispatch_async(dispatch_get_global_queue(0, 0), ^{  
//add your code  
}); 

4、對於Block中的代碼不能操作UI線程,否則就違背了線程安全原則,可以使用下面的方式對UI進行操作
 dispatch_async(dispatch_get_global_queue(0, 0), ^{  
          
        NSString *fetchedData =[self fetchSomeThingFromServer];  
        …………  
          
        dispatch_async(dispatch_get_main_queue(), ^{  
              //add your UI code  
        });  
    }

5、關於Block併發,使用dispatch_group_t,如下所示:
dispatch_async(dispatch_get_global_queue(0, 0), ^{  
          
        NSString *fetchedData =[self fetchSomeThingFromServer];  
        NSString *processedData = [self processData:fetchedData];  
  
          
        __block NSString *firstResult;  
        __block NSString *secondResult;  
          
        dispatch_group_t group = dispatch_group_create();  
        //處理併發1  
        dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{  
            firstResult = [[self calculateFirstResult:processedData] retain];  
        });  
        //處理併發1  
        dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{  
            secondResult = [[self calculateSecondResult:processedData] retain];  
        });  
          
        //dispatch_group_notify指定的是該組所有併發塊執行完後執行的代碼  
        dispatch_group_notify(group,dispatch_get_global_queue(0, 0),^{  
              
            NSDate *endTime =[NSDate date];  
            NSLog(@"%f------",[endTime timeIntervalSinceDate:startTime]);  
          
            [firstResult release];  
            [secondResult release];  
        });  
    });

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章