• ios GCD的使用及封装



















    实现代码:

    CGDHelper

      1 /* 
      2  *  Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。 
      3  *  系统要求:iOS4.0以上。 
      4  */  
      5   
      6 #import <Foundation/Foundation.h>  
      7    
      8 ///////////////////////////////////////     enum 声明     /////////////////////////////////////////////////  
      9   
     10 //队列优先级  
     11 typedef enum  
     12 {  
     13     GlobalQueuePriorityDefault = 0,  
     14     GlobalQueuePriorityHigh = 2,  
     15     GlobalQueuePriorityLow = -2,  
     16     GlobalQueuePriorityBackground = INT16_MIN  
     17       
     18 } GlobalQueuePriority;  
     19   
     20 //阻塞、非阻塞  
     21 typedef enum  
     22 {  
     23     PerformBlockFeatureChoke,  
     24     PerformBlockFeatureUnchoke  
     25       
     26 } PerformBlockFeature;  
     27   
     28 //网络请求方法  
     29 typedef enum GCDHelperHttpRequestMethod  
     30 {  
     31     GCDHelperHttpRequestMethodGET = 0,  
     32     GCDHelperHttpRequestMethodPOST  
     33       
     34 } GCDHelperHttpRequestMethod;  
     35   
     36 ///////////////////////////////////////     Block 声明     /////////////////////////////////////////////////  
     37   
     38 //返回值void  
     39 typedef     void (^GCDBlock)                         (void);  
     40 typedef     void (^GCDBlock1_Size_t)                 (size_t index);  
     41 typedef     void (^GCDBlock1_Int)                    (int index);  
     42 typedef     void (^GCDBlock1_Bool)                   (BOOL flag);  
     43 typedef     void (^GCDBlock1_Float)                  (float index);  
     44 typedef     void (^GCDBlock1_Obj)                    (id object);  
     45   
     46 //返回值void,两个形式参数  
     47 typedef     void (^GCDBlock2)                        (id object1, size_t index);  
     48 typedef     void (^GCDBlock2_Obj_Int)                (id object1, int index);  
     49 typedef     void (^GCDBlock2_Obj_Obj)                (id object1, id object2);  
     50   
     51 //有返回值  
     52 typedef     id   (^GCD_Obj_Block_Obj)                (id object);  
     53 typedef     id   (^GCD_Obj_Block_Void)               (void);  
     54   
     55 typedef     void (^GCDHttpRequestBlock)              (NSURLResponse *response, NSError *error, NSData *data);  
     56   
     57   
     58 ///////////////////////////////////////     GCDHelper 声明     /////////////////////////////////////////////////  
     59   
     60 @interface GCDHelper : NSObject  
     61   
     62 /* 获取3种队列 */  
     63 + (dispatch_queue_t) gcdMainQueue;  
     64 + (dispatch_queue_t) gcdGlobalQueue:(GlobalQueuePriority) priority;  
     65 + (dispatch_queue_t) gcdCustomQueue:(NSString *) queueName;  
     66   
     67 //后台执行  
     68 + (void) gcdPerformBlockAsynchronous:(GCDBlock) block;  
     69   
     70 //后台获取数据后,回到主线程  
     71 + (void) gcdPerformBlockAsynchronous:(GCDBlock) blockAsyn  
     72                          finishOnMainQueue:(GCDBlock) blockM;  
     73   
     74   
     75 /* 3种队列上执行Block  
     76  * 
     77  * 是否阻塞执行:(PerformBlockFeature) feature 
     78  * 全局队列优先级:(GlobalQueuePriority) priority 
     79  */  
     80 + (void) gcdPerformBlockOnMainQueue:(GCDBlock) block feature:(PerformBlockFeature) feature;  
     81   
     82 + (void) gcdPerformBlockOnGlobalQueue:(GCDBlock) block  
     83                               feature:(PerformBlockFeature) feature  
     84                              priority:(GlobalQueuePriority) priority;  
     85   
     86 + (void) gcdPerformBlockOnCustomQueue:(GCDBlock) block  
     87                               feature:(PerformBlockFeature) feature  
     88                                  name:(NSString *) queueName;  
     89   
     90   
     91 //延迟执行方法  
     92 + (void) gcdPerformBlock:(GCDBlock) block  
     93                  onQueue:(dispatch_queue_t) queue  
     94              delaySecond:(int64_t) second;  
     95   
     96   
     97 //只执行一次  
     98 + (void) gcdPerformBlockOnce:(GCDBlock) block;  
     99   
    100 //并发  
    101 + (void) gcdBatchPerformBlocks:(NSArray *) blockArray finally:(GCDBlock) finallyBlock;  
    102   
    103 + (void) gcdBatchPerformBlockWithData:(NSArray *) dataArray  
    104           maxConcurrentOperationCount:(uint) count  
    105                           handleBlock:(GCDBlock1_Obj) block  
    106                               finally:(GCDBlock1_Obj) finallyBlock;  
    107   
    108   
    109   
    110 @end  
    111   
    112 ///////////////////////////////////////     图片下载     /////////////////////////////////////////////////  
    113   
    114 @interface GCDHelper (ImageDownload)  
    115   
    116 - (void) gcdImageWithURLString:(NSString *) URLString;  
    117 - (void) gcdImageWithURLString:(NSString *) URLString completion:(GCDBlock2_Obj_Obj) completion;  
    118   
    119 @end  
    120   
    121 ///////////////////////////////////////     网络请求     /////////////////////////////////////////////////  
    122   
    123 GCDBlock1_Bool _netWorkBlock;  
    124 @interface GCDHelper (NetworkConnect)  
    125   
    126 //网络连接判断、实时监控  
    127 - (void) gcdNetWorkGuarder:(NSString *) hostname withBlock:(GCDBlock1_Bool) block;  
    128   
    129 @end  
    130   
    131   
    132 @interface GCDHelper (HttpRequest)  
    133   
    134 //GCD请求网络(GET方式测试通过,POST方式测试未通过)  
    135 - (void) gcdHttpRequestWithURL:(NSString *) URLString  
    136                     httpMethod:(GCDHelperHttpRequestMethod) method  
    137                         params:(NSDictionary *) params  
    138                        timeout:(NSTimeInterval) time  
    139                        success:(GCDHttpRequestBlock) successBlock  
    140                           fail:(GCDHttpRequestBlock) failBlock;  
    141   
    142 @end 
      1 #import "GCDHelper.h"  
      2   
      3 #import <SystemConfiguration/SystemConfiguration.h>  
      4   
      5 #import <sys/socket.h>  
      6 #import <netinet/in.h>  
      7 #import <netinet6/in6.h>  
      8 #import <arpa/inet.h>  
      9 #import <ifaddrs.h>  
     10 #import <netdb.h>  
     11   
     12 //Error  
     13 #define GCDHelperErrorURLISNULL   [NSError errorWithDomain:@"please setup GCDHelper‘s url or urlString" code:100 userInfo:nil]  
     14 #define GCDHelperErrorRequestISNULL  [NSError errorWithDomain:@"request can not be nil!" code:101 userInfo:nil]  
     15 #define GCDHelperErrorFileExist    [NSError errorWithDomain:@"File Exist!" code:102 userInfo:nil]  
     16 #define GCDHelperErrorCreateFail   [NSError errorWithDomain:@"Create File Fail!" code:103 userInfo:nil]  
     17   
     18 //下载的临时文件的后缀  
     19 #define kTHDownLoadTask_TempSuffix  @".TempDownload"  
     20 //计算下载速度的取样时间  
     21 #define kTHDownLoadTimerInterval  2.0  
     22 //THDispatchQueue默认的并发数  
     23 #define kTHDispatchQueueDefaultConcurrentCount 10  
     24   
     25 #define kDefaultTimeoutInterval  15  
     26   
     27   
     28 static NSString * const BOUNDRY        = @"--------------------------7d71a819230404";  
     29   
     30   
     31 @implementation GCDHelper  
     32   
     33 - (void) dealloc  
     34 {  
     35     [super dealloc];  
     36 }  
     37   
     38 - (id) init  
     39 {  
     40     if (self = [super init])  
     41     {  
     42     }  
     43       
     44     return self;  
     45 }  
     46   
     47 #pragma mark -  
     48 #pragma mark 获取队列  
     49   
     50 + (dispatch_queue_t) gcdMainQueue  
     51 {  
     52     return dispatch_get_main_queue();  
     53 }  
     54   
     55 + (dispatch_queue_t) gcdGlobalQueue:(GlobalQueuePriority) priority  
     56 {  
     57     switch (priority)  
     58     {  
     59         case GlobalQueuePriorityDefault:  
     60             return dispatch_get_global_queue(priority, 0);  
     61             break;  
     62         case GlobalQueuePriorityHigh:  
     63             return dispatch_get_global_queue(priority, 0);  
     64             break;  
     65         case GlobalQueuePriorityLow:  
     66             return dispatch_get_global_queue(priority, 0);  
     67             break;  
     68         case GlobalQueuePriorityBackground:  
     69             return dispatch_get_global_queue(priority, 0);  
     70             break;  
     71               
     72         default:  
     73             return dispatch_get_global_queue(GlobalQueuePriorityDefault, 0);  
     74             break;  
     75     }  
     76 }  
     77   
     78 + (dispatch_queue_t) gcdCustomQueue:(NSString *) queueName;  
     79 {  
     80     return dispatch_queue_create([queueName UTF8String], NULL);  
     81 }  
     82   
     83 #pragma mark -  
     84 #pragma mark 3种队列上执行Block  
     85   
     86 + (void) gcdPerformBlockOnMainQueue:(GCDBlock) block feature:(PerformBlockFeature) feature  
     87 {  
     88     switch (feature)  
     89     {  
     90         case PerformBlockFeatureChoke:  
     91             dispatch_sync([GCDHelper gcdMainQueue], block);  
     92             break;  
     93               
     94         case PerformBlockFeatureUnchoke:  
     95             dispatch_async([GCDHelper gcdMainQueue], block);  
     96             break;  
     97               
     98         default:  
     99             dispatch_sync([GCDHelper gcdMainQueue], block);  
    100             break;  
    101     }  
    102 }  
    103   
    104 + (void) gcdPerformBlockOnGlobalQueue:(GCDBlock) block feature:(PerformBlockFeature) feature priority:(GlobalQueuePriority) priority  
    105 {  
    106     switch (feature)  
    107     {  
    108         case PerformBlockFeatureChoke:  
    109             dispatch_sync([GCDHelper gcdGlobalQueue:priority], block);  
    110             break;  
    111               
    112         case PerformBlockFeatureUnchoke:  
    113             dispatch_async([GCDHelper gcdGlobalQueue:priority], block);  
    114             break;  
    115               
    116         default:  
    117             dispatch_sync([GCDHelper gcdGlobalQueue:GlobalQueuePriorityDefault], block);  
    118             break;  
    119     }  
    120 }  
    121   
    122 + (void) gcdPerformBlockOnCustomQueue:(GCDBlock) block feature:(PerformBlockFeature) feature name:(NSString *) queueName  
    123 {  
    124     switch (feature)  
    125     {  
    126         case PerformBlockFeatureChoke:  
    127             dispatch_sync([GCDHelper gcdCustomQueue:queueName], block);  
    128             break;  
    129               
    130         case PerformBlockFeatureUnchoke:  
    131             dispatch_async([GCDHelper gcdCustomQueue:queueName], block);  
    132             break;  
    133               
    134         default:  
    135             dispatch_sync([GCDHelper gcdCustomQueue:@"com.GCDHelper.Queue"], block);  
    136             break;  
    137     }  
    138 }  
    139   
    140 //后台执行  
    141 + (void) gcdPerformBlockAsynchronous:(GCDBlock) block  
    142 {  
    143     [GCDHelper gcdPerformBlockOnGlobalQueue:block  
    144                                     feature:PerformBlockFeatureUnchoke  
    145                                    priority:GlobalQueuePriorityDefault];  
    146 }  
    147   
    148 //后台获取数据后,回到主线程  
    149 + (void) gcdPerformBlockAsynchronous:(GCDBlock) blockAsyn  
    150                    finishOnMainQueue:(GCDBlock) blockM  
    151 {  
    152     dispatch_async([GCDHelper gcdGlobalQueue:GlobalQueuePriorityDefault], ^{  
    153         blockAsyn();  
    154         dispatch_async([GCDHelper gcdMainQueue], ^{  
    155             blockM();  
    156         });  
    157     });  
    158 }  
    159   
    160 #pragma mark -  
    161 #pragma mark 队列延迟时间执行方法  
    162 + (void) gcdPerformBlock:(GCDBlock) block onQueue:(dispatch_queue_t) queue delaySecond:(int64_t) second  
    163 {  
    164     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, second * NSEC_PER_SEC);  
    165     dispatch_after(popTime, queue, block);  
    166 }  
    167   
    168 #pragma mark -  
    169 #pragma mark 只执行一次  
    170   
    171 + (void) gcdPerformBlockOnce:(GCDBlock) block  
    172 {  
    173     static dispatch_once_t onceToken;  
    174     dispatch_once(&onceToken, block);  
    175 }  
    176   
    177 #pragma mark -  
    178 #pragma mark 无序并发  
    179   
    180 + (void) gcdBatchPerformBlocks:(NSArray *) blockArray finally:(GCDBlock) finallyBlock  
    181 {  
    182     [blockArray retain];  
    183       
    184     dispatch_queue_t queue = [GCDHelper gcdGlobalQueue:GlobalQueuePriorityDefault];  
    185     dispatch_group_t group = dispatch_group_create();  
    186       
    187     for(GCDBlock block in blockArray)  
    188     {  
    189         dispatch_group_async(group, queue, ^{  
    190             block();  
    191         });  
    192     }  
    193     dispatch_group_wait(group, DISPATCH_TIME_FOREVER);  
    194       
    195     dispatch_async([GCDHelper gcdGlobalQueue:GlobalQueuePriorityDefault], ^{  
    196         finallyBlock();  
    197     });  
    198       
    199     dispatch_release(group);  
    200       
    201     [blockArray release];  
    202 }  
    203   
    204 + (void) gcdBatchPerformBlockWithData:(NSArray *) dataArray  
    205           maxConcurrentOperationCount:(uint) count  
    206                           handleBlock:(GCDBlock1_Obj) block  
    207                               finally:(GCDBlock1_Obj) finallyBlock  
    208 {  
    209     [dataArray retain];  
    210       
    211     dispatch_queue_t queue = [GCDHelper gcdGlobalQueue:GlobalQueuePriorityDefault];  
    212     dispatch_group_t group = dispatch_group_create();  
    213     dispatch_semaphore_t semaphore = dispatch_semaphore_create(count);  
    214     for(id obj in dataArray)  
    215     {  
    216         NSLog(@"并发中");  
    217         dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);  
    218         dispatch_group_async(group, queue, ^{  
    219             block(obj);  
    220             dispatch_semaphore_signal(semaphore);  
    221         });  
    222     }  
    223       
    224     dispatch_group_wait(group, DISPATCH_TIME_FOREVER);  
    225     dispatch_group_notify(group, queue, ^{  
    226         finallyBlock(dataArray);  
    227     });  
    228     dispatch_release(group);  
    229       
    230     [dataArray release];  
    231 }  
    232   
    233   
    234   
    235 #pragma mark -  
    236 #pragma mark 图片下载  
    237   
    238 - (void) gcdImageWithURLString:(NSString *) URLString  
    239 {  
    240     [self gcdImageWithURLString:URLString completion:nil];  
    241 }  
    242   
    243 - (void) gcdImageWithURLString:(NSString *) URLString completion:(GCDBlock2_Obj_Obj) completion  
    244 {  
    245     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    246           
    247         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    248         [request setURL:[NSURL URLWithString:URLString]];  
    249         [request setHTTPMethod:@"GET"];  
    250         NSData *returnData = [NSURLConnection sendSynchronousRequest:request  
    251                                                    returningResponse:nil  
    252                                                                error:nil];  
    253         [request release];  
    254           
    255         UIImage *image  = [UIImage imageWithData:returnData];  
    256           
    257         if (image)  
    258         {  
    259             dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    260                 completion(image, URLString);  
    261             });  
    262         } else  
    263         {  
    264             dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    265                 completion(image, URLString);  
    266             });  
    267         }  
    268     });  
    269 }  
    270   
    271 @end  
    272   
    273   
    274 #pragma mark -  
    275 #pragma mark 网络部分  
    276   
    277 @implementation GCDHelper (NetworkConnect)  
    278   
    279 - (BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags  
    280 {  
    281     BOOL connectionUP = YES;  
    282       
    283     if(!(flags & kSCNetworkReachabilityFlagsReachable))  
    284         connectionUP = NO;  
    285       
    286     if( (flags & (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection)) == (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection) )  
    287         connectionUP = NO;  
    288       
    289     return connectionUP;  
    290 }  
    291   
    292 -(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags  
    293 {  
    294     dispatch_async(dispatch_get_main_queue(), ^{  
    295         _netWorkBlock([self isReachableWithFlags:flags]);  
    296     });  
    297 }  
    298   
    299 static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)  
    300 {  
    301     @autoreleasepool  
    302     {  
    303         [(GCDHelper *)info reachabilityChanged:flags];  
    304     }  
    305 }  
    306   
    307 - (void) gcdNetWorkGuarder:(NSString *) hostname withBlock:(GCDBlock1_Bool) block  
    308 {  
    309     _netWorkBlock = block;  
    310       
    311     SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);  
    312     SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL };  
    313     dispatch_queue_t queue = dispatch_queue_create("com.myself.reachability", NULL);  
    314     context.info = (void *)self;  
    315     SCNetworkReachabilitySetCallback(ref, TMReachabilityCallback, &context);  
    316     SCNetworkReachabilitySetDispatchQueue(ref, queue);  
    317 }  
    318   
    319 @end  
    320   
    321 @implementation GCDHelper(HttpRequest)  
    322   
    323 - (void) startPOSTHTTPRequest:(NSString *) URLString  
    324                        params:(NSDictionary *) params  
    325                       timeout:(NSTimeInterval) time  
    326                       success:(GCDHttpRequestBlock) successBlock  
    327                          fail:(GCDHttpRequestBlock) failBlock  
    328 {  
    329     [params retain];  
    330     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    331           
    332         __block NSURLResponse  *response = nil;  
    333         __block NSError *error = nil;  
    334         __block NSData *receiveData = nil;  
    335           
    336         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    337           
    338         [request setURL:[NSURL URLWithString:[URLString lowercaseString]]];  
    339         [request setHTTPMethod:@"POST"];  
    340         [request setCachePolicy:NSURLRequestUseProtocolCachePolicy];  
    341         [request setTimeoutInterval:time];  
    342           
    343         if (!request)  
    344         {  
    345             NSDictionary *errorInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"发送请求失败", @"errorKey", nil];  
    346             error = [NSError errorWithDomain:@"www.myself.com" code:100 userInfo:errorInfo];  
    347               
    348             dispatch_async(dispatch_get_main_queue(), ^{  
    349                 successBlock(response, error, receiveData);  
    350             });  
    351               
    352             return;  
    353         }  
    354           
    355         if (params != nil)  
    356         {  
    357             [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", BOUNDRY]  
    358            forHTTPHeaderField:@"Content-Type"];  
    359               
    360             int len=512;  
    361             NSMutableData *postData =[NSMutableData dataWithCapacity:len];  
    362             [postData appendData:[[NSString stringWithFormat:@"--%@/r/n", BOUNDRY]  
    363                                   dataUsingEncoding:NSUTF8StringEncoding]];  
    364             int i=0;  
    365             int cnt = [params count];  
    366               
    367             for (NSString *key in [params allKeys])  
    368             {  
    369                 // NSString *str = [NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"/r/n/r/n", key];  
    370                 [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"/r/n/r/n", key] dataUsingEncoding:NSUTF8StringEncoding]];  
    371                   
    372                 [postData  appendData: [[NSString stringWithFormat:@"%@",[params objectForKey:key]]  
    373                                         dataUsingEncoding:NSUTF8StringEncoding]];  
    374                 if(i != cnt - 1)  
    375                 {  
    376                     [postData appendData:[[NSString stringWithFormat:@"/r/n--%@/r/n", BOUNDRY]  
    377                                           dataUsingEncoding:NSUTF8StringEncoding]];  
    378                 }  
    379                 i++ ;  
    380             }  
    381             [postData  appendData:[[NSString stringWithFormat:@"/r/n--%@--/r/n", BOUNDRY]  
    382                                    dataUsingEncoding:NSUTF8StringEncoding]];  
    383               
    384             [request  setHTTPBody:postData];  
    385         }  
    386           
    387         receiveData = [[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error] retain];  
    388         if (!error)  
    389         {  
    390             dispatch_async(dispatch_get_main_queue(), ^{  
    391                 successBlock(response, nil, receiveData);  
    392             });  
    393         }  
    394         else  
    395         {  
    396             dispatch_async(dispatch_get_main_queue(), ^{  
    397                 successBlock(response, error, receiveData);  
    398             });  
    399         }  
    400           
    401         [request release];  
    402     });  
    403       
    404     [params release];  
    405 }  
    406   
    407 - (void) startGETHTTPRequest:(NSString *) URLString  
    408                       params:(NSDictionary *) params  
    409                      timeout:(NSTimeInterval) time  
    410                      success:(GCDHttpRequestBlock) successBlock  
    411                         fail:(GCDHttpRequestBlock) failBlock  
    412 {  
    413     [params retain];  
    414       
    415     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    416         __block NSURLResponse  *response = nil;  
    417         __block NSError *error = nil;  
    418         __block NSData *receiveData = nil;  
    419           
    420         NSMutableString *paramsString = [[NSMutableString alloc] init];  
    421         for(NSString *key in params)  
    422         {  
    423             [paramsString appendFormat:@"&%@=%@", key, [params objectForKey:key]];  
    424         }  
    425         NSString *requestString = [[NSString alloc] initWithFormat:@"%@%@", URLString, paramsString];  
    426         NSURL *reqUrl = [[NSURL alloc] initWithString:requestString];  
    427           
    428         [paramsString release];  
    429         [requestString release];  
    430           
    431         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    432           
    433         [request setURL:reqUrl];  
    434         [request setHTTPMethod:@"GET"];  
    435         [request setCachePolicy:NSURLRequestUseProtocolCachePolicy];  
    436         [request setTimeoutInterval:time];  
    437           
    438         [reqUrl release];  
    439       
    440         if (request)  
    441         {  
    442             receiveData = [[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error] retain];  
    443         }  
    444           
    445         if (!error)  
    446         {  
    447             dispatch_async(dispatch_get_main_queue(), ^{  
    448                 successBlock(response, nil, receiveData);  
    449             });  
    450         }  
    451         else  
    452         {  
    453             dispatch_async(dispatch_get_main_queue(), ^{  
    454                 successBlock(response, error, receiveData);  
    455             });  
    456         }  
    457           
    458         [request release];  
    459     });  
    460       
    461     [params release];  
    462 }  
    463   
    464 - (void) gcdHttpRequestWithURL:(NSString *) URLString  
    465                     httpMethod:(GCDHelperHttpRequestMethod) method  
    466                         params:(NSDictionary *) params  
    467                        timeout:(NSTimeInterval) time  
    468                        success:(GCDHttpRequestBlock) successBlock  
    469                           fail:(GCDHttpRequestBlock) failBlock  
    470 {  
    471     switch (method)  
    472     {  
    473         case GCDHelperHttpRequestMethodGET:  
    474         {  
    475             [self startGETHTTPRequest:URLString params:params timeout:time success:successBlock fail:failBlock];  
    476             break;  
    477         }  
    478         case GCDHelperHttpRequestMethodPOST:  
    479         {  
    480             [self startPOSTHTTPRequest:URLString params:params timeout:time success:successBlock fail:failBlock];  
    481             break;  
    482         }  
    483   
    484         default:  
    485             break;  
    486     }  
    487 }  
    488   
    489 @end 
    用法举例:

    一、基本概念举例:

      1 [cpp] view plaincopyprint?
      2 
      3     #import <UIKit/UIKit.h>  
      4       
      5     @interface BaseViewController : UIViewController  
      6     {  
      7         IBOutlet UITextField *field1;  
      8         IBOutlet UITextField *field2;  
      9         IBOutlet UITextField *field3;  
     10           
     11         IBOutlet UITextField *textField;  
     12           
     13         dispatch_queue_t queue;  
     14     }  
     15       
     16     - (IBAction) calculate:(id)sender;  
     17     - (IBAction) operationQueue:(id)sender;  
     18     - (IBAction) gcd:(id)sender;  
     19       
     20     - (IBAction) notchoke:(id)sender;  
     21     - (IBAction) choke:(id)sender;  
     22       
     23     - (IBAction) getUIData:(id)sender;  
     24       
     25       
     26     - (IBAction)startQueue:(id)sender;  
     27     - (IBAction)suspendQueue:(id)sender;  
     28     - (IBAction)resumeQueue:(id)sender;  
     29       
     30     @end  
     31 
     32 
     33 [cpp] view plaincopyprint?
     34 
     35     #import "BaseViewController.h"  
     36       
     37     @implementation BaseViewController  
     38       
     39     - (void) dealloc  
     40     {  
     41         dispatch_release(queue);  
     42           
     43         [super dealloc];  
     44     }  
     45       
     46     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
     47     {  
     48         self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
     49         if (self) {  
     50             queue = dispatch_queue_create("sss", NULL);  
     51         }  
     52         return self;  
     53     }  
     54       
     55     - (void)viewDidLoad  
     56     {  
     57         [super viewDidLoad];  
     58         // Do any additional setup after loading the view from its nib.  
     59     }  
     60       
     61     - (void) longTask:(id) sender  
     62     {  
     63         NSMutableArray *arr = [NSMutableArray array];  
     64         for (int i = 0; i < 1000; i++) {  
     65               
     66             [arr addObject:[NSMutableArray arrayWithObject:@(i)]];  
     67             NSLog(@"longTask:%d", i);  
     68         }  
     69     }  
     70       
     71     - (void) longTaskOther:(id) sender  
     72     {  
     73         NSMutableArray *arr = [NSMutableArray array];  
     74         for (int i = 0; i < 10000; i++) {  
     75               
     76             [arr addObject:[NSMutableArray arrayWithObject:@(i)]];  
     77             NSLog(@"longTaskOther:%d", i);  
     78         }  
     79     }  
     80       
     81     - (IBAction) calculate:(id)sender  
     82     {  
     83         field3.text = [NSString stringWithFormat:@"%f", [field1.text floatValue] - [field2.text floatValue]];  
     84     }  
     85     - (IBAction) operationQueue:(id)sender;  
     86     {  
     87         NSOperationQueue *aqueue = [NSOperationQueue new];  
     88         NSInvocationOperation *operation = [[NSInvocationOperation alloc]  
     89                                             initWithTarget:self  
     90                                             selector:@selector(longTask:)  
     91                                             object:nil];  
     92         NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]  
     93                                             initWithTarget:self  
     94                                             selector:@selector(longTaskOther:)  
     95                                             object:nil];  
     96           
     97       
     98         [aqueue addOperation:operation];  
     99         [aqueue addOperation:operation1];  
    100           
    101         [operation release];  
    102         [operation1 release];  
    103     }  
    104     - (IBAction) gcd:(id)sender  //3.192999  
    105     {  
    106         [GCDHelper gcdPerformBlockAsynchronous:^{  
    107             NSMutableArray *arr = [NSMutableArray array];  
    108             for (int i = 0; i < 1000; i++) {  
    109                   
    110                 [arr addObject:[NSMutableArray arrayWithObject:@(i)]];  
    111                 NSLog(@"longTask:%d", i);  
    112             }  
    113         }];  
    114           
    115         [GCDHelper gcdPerformBlockAsynchronous:^{  
    116             NSMutableArray *arr = [NSMutableArray array];  
    117             for (int i = 0; i < 10000; i++) {  
    118                   
    119                 [arr addObject:[NSMutableArray arrayWithObject:@(i)]];  
    120                 NSLog(@"longTaskOther:%d", i);  
    121             }  
    122         }];  
    123     }  
    124       
    125     //////////////////////////////////////////////////////  
    126       
    127     - (IBAction)notchoke:(id)sender  
    128     {  
    129         dispatch_async(dispatch_get_main_queue(), ^{  
    130             NSLog(@"qqq");  
    131         });  
    132       
    133         NSLog(@"不阻塞");  
    134     }  
    135       
    136       
    137     //Calls to dispatch_sync() targeting the current queue will result  
    138     //* in dead-lock. Use of dispatch_sync() is also subject to the same  
    139     //* multi-party dead-lock problems that may result from the use of a mutex.  
    140     //* Use of dispatch_async() is preferred.  
    141     //在当前队列上调用dispatch_sync() 会导致死锁。调用dispatch_sync(),并使用mutex 经常会导致多方死锁问题。  
    142     - (IBAction) choke:(id)sender  
    143     {  
    144         dispatch_queue_t exampleQueue;  
    145           
    146         int i = 3;  
    147         switch (i) {  
    148             case 0:  
    149                 exampleQueue = dispatch_get_global_queue(0, 0);  
    150                 break;  
    151             case 1:  
    152                 exampleQueue = dispatch_queue_create("com.abc.xxx", NULL);  
    153                 break;  
    154             case 2:  
    155                 exampleQueue = dispatch_get_current_queue();  
    156                 break;  
    157             case 3:  
    158                 exampleQueue = dispatch_get_main_queue();  
    159                 break;  
    160                   
    161             default:  
    162                 exampleQueue = dispatch_get_global_queue(0, 0);  
    163                 break;  
    164         }  
    165           
    166         dispatch_sync( exampleQueue,^{  
    167             [self longTask:nil];  
    168         });  
    169           
    170         NSLog(@"task finish");  
    171     }  
    172       
    173     - (IBAction) getUIData:(id)sender  
    174     {  
    175         dispatch_async(dispatch_get_global_queue(0, 0), ^{  
    176               
    177             __block NSString *stringValue;  
    178             dispatch_sync(dispatch_get_main_queue(), ^{  
    179                 stringValue = [textField.text copy];  
    180             });  
    181               
    182             [stringValue retain];  
    183               
    184             NSLog(@"stringValue:%@", stringValue);  
    185         });  
    186     }  
    187       
    188       
    189       
    190     //一个要注意的地方是,dispatch queue的挂起是block粒度的。换句话说,挂起一个queue并不会将当前正在执行的block挂起。它会允许当前执行的block执行完毕,然后后续的block不再会被执行,直至queue被恢复。  
    191     //还有一个注意点:从man页上得来的:如果你挂起了一个queue或者source,那么销毁它之前,必须先对其进行恢复。  
    192     - (IBAction)startQueue:(id)sender  
    193     {  
    194         dispatch_async(queue, ^{  
    195             for (int i = 0; i < 10000; i++) {  
    196                 NSLog(@"taskA");  
    197             }  
    198         });  
    199           
    200         dispatch_async(queue, ^{  
    201             for (int i = 0; i < 10000; i++) {  
    202                 NSLog(@"taskB");  
    203             }  
    204         });  
    205           
    206         dispatch_async(queue, ^{  
    207             for (int i = 0; i < 10000; i++) {  
    208                 NSLog(@"taskC");  
    209             }  
    210         });  
    211     }  
    212     - (IBAction)suspendQueue:(id)sender  
    213     {  
    214         NSLog(@"Queue suspend");  
    215         dispatch_suspend(queue);  
    216       
    217     }  
    218     - (IBAction)resumeQueue:(id)sender  
    219     {  
    220         NSLog(@"Queue resume");  
    221         dispatch_resume(queue);  
    222       
    223     }  

    二、基本用法举例

    例子1:

      1     #import <UIKit/UIKit.h>  
      2       
      3     @interface OneViewController : UIViewController  
      4       
      5       
      6     //无序并发  
      7     - (IBAction)selector0:(id)sender;  
      8       
      9     //无序并发处理数据  
     10     - (IBAction)selector100:(id)sender;  
     11       
     12     //执行一次  
     13     - (IBAction)selector1:(id)sender;  
     14       
     15     //异步/后台执行  
     16     - (IBAction)selector2:(id)sender;  
     17       
     18     //后台执行,然后返回主线程  
     19     - (IBAction)selector3:(id)sender;  
     20       
     21     //三种队列执行  
     22     - (IBAction)selector4:(UISegmentedControl *)sender;  
     23       
     24     //延迟执行  
     25     - (IBAction)selector5:(id)sender;  
     26       
     27     @end  
     28 
     29 
     30 [cpp] view plaincopyprint?
     31 
     32     #import "OneViewController.h"  
     33       
     34     @interface OneViewController ()  
     35       
     36     @end  
     37       
     38     @implementation OneViewController  
     39       
     40     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
     41     {  
     42         self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
     43         if (self) {  
     44             // Custom initialization  
     45         }  
     46         return self;  
     47     }  
     48       
     49     - (void)viewDidLoad  
     50     {  
     51         [super viewDidLoad];  
     52     }  
     53       
     54     - (NSMutableArray *) getBlockArray  
     55     {  
     56         NSMutableArray *arr = [[NSMutableArray array] retain];  
     57           
     58         GCDBlock b0 = ^{ NSLog(@"无序并发: 0"); sleep(3); }; [arr addObject:b0];  
     59         GCDBlock b1 = ^{ NSLog(@"无序并发: 1"); }; [arr addObject:b1];  
     60         GCDBlock b2 = ^{ NSLog(@"无序并发: 2"); }; [arr addObject:b2];  
     61         GCDBlock b3 = ^{ NSLog(@"无序并发: 3"); }; [arr addObject:b3];  
     62         GCDBlock b4 = ^{ NSLog(@"无序并发: 4"); }; [arr addObject:b4];  
     63         GCDBlock b5 = ^{ NSLog(@"无序并发: 5"); }; [arr addObject:b5];  
     64         GCDBlock b6 = ^{ NSLog(@"无序并发: 6"); }; [arr addObject:b6];  
     65         GCDBlock b7 = ^{ NSLog(@"无序并发: 7"); }; [arr addObject:b7];  
     66         GCDBlock b8 = ^{ NSLog(@"无序并发: 8"); }; [arr addObject:b8];  
     67         GCDBlock b9 = ^{ NSLog(@"无序并发: 9"); }; [arr addObject:b9];  
     68         GCDBlock b10 = ^{ NSLog(@"无序并发: 10"); }; [arr addObject:b10];  
     69         GCDBlock b11 = ^{ NSLog(@"无序并发: 11"); }; [arr addObject:b11];  
     70         GCDBlock b12 = ^{ NSLog(@"无序并发: 12"); }; [arr addObject:b12];  
     71         GCDBlock b13 = ^{ NSLog(@"无序并发: 13"); }; [arr addObject:b13];  
     72         GCDBlock b14 = ^{ NSLog(@"无序并发: 14"); }; [arr addObject:b14];  
     73         GCDBlock b15 = ^{ NSLog(@"无序并发: 15"); }; [arr addObject:b15];  
     74           
     75         return arr;  
     76     }  
     77       
     78     //无序并发  
     79     - (IBAction)selector0:(id)sender  
     80     {  
     81         [GCDHelper gcdBatchPerformBlocks:[self getBlockArray] finally:^{  
     82             NSLog(@"一组有序并发完成");  
     83         }];  
     84           
     85     //    NSLog(@"一组无序并发完成");  
     86     }  
     87       
     88       
     89     - (IBAction)selector100:(id)sender  
     90     {  
     91         NSMutableArray *arr = [NSMutableArray array];  
     92         for (int i = 0; i < 100; i++) {  
     93             [arr addObject:[NSMutableArray array]];  
     94         }  
     95           
     96         __block int i = 0;  
     97         [GCDHelper gcdBatchPerformBlockWithData:arr maxConcurrentOperationCount:10 handleBlock:^(id object) {  
     98               
     99             sleep(1);  
    100             NSMutableArray *arr = (NSMutableArray *)object;  
    101             [arr addObject:@(i)];  
    102             i++;  
    103         } finally:^(id object) {  
    104             NSLog(@"arr:%@", object);  
    105         }];  
    106     }  
    107       
    108     - (IBAction)selector1:(id)sender  
    109     {  
    110         [GCDHelper gcdPerformBlockOnce:^{  
    111             NSLog(@"别想让我执行第二次");  
    112         }];  
    113         NSLog(@"不执行~");  
    114     }  
    115       
    116     //异步/后台执行  
    117     - (IBAction)selector2:(id)sender  
    118     {  
    119         [GCDHelper gcdPerformBlockAsynchronous:^{  
    120             sleep(3);  
    121              NSLog(@"全局队列执行完成");  
    122         }];  
    123         NSLog(@"全局队列执行,不影响主队列");  
    124     }  
    125       
    126     //后台执行,然后返回主线程  
    127     - (IBAction)selector3:(id)sender  
    128     {  
    129         [GCDHelper gcdPerformBlockAsynchronous:^{  
    130              
    131             for (int i = 0; i< 10; i++)  
    132             {  
    133                 NSLog(@"全局队列执行: %d", i);  
    134             }  
    135               
    136         } finishOnMainQueue:^{  
    137             NSLog(@"回到主队列");  
    138         }];  
    139     }  
    140       
    141     //三种队列执行  
    142     - (IBAction)selector4:(UISegmentedControl *)sender  
    143     {  
    144         switch (sender.selectedSegmentIndex) {  
    145             case 0:  
    146             {  
    147                 [GCDHelper gcdPerformBlockOnMainQueue:^{  
    148                     NSLog(@"主队列执行");  
    149                 } feature:PerformBlockFeatureUnchoke];  
    150                 break;  
    151             }  
    152             case 1:  
    153             {  
    154                 [GCDHelper gcdPerformBlockOnGlobalQueue:^{  
    155                     NSLog(@"全局队列执行");  
    156                 } feature:PerformBlockFeatureUnchoke priority:GlobalQueuePriorityDefault];  
    157                 break;  
    158             }  
    159             case 2:  
    160             {  
    161                 [GCDHelper gcdPerformBlockOnCustomQueue:^{  
    162                     NSLog(@"自创建队列执行");  
    163                 } feature:PerformBlockFeatureUnchoke name:@"com.abc.bcd"];  
    164                 break;  
    165             }  
    166                   
    167             default:  
    168                 break;  
    169         }  
    170     }  
    171       
    172     //延迟执行  
    173     - (IBAction)selector5:(id)sender  
    174     {  
    175         NSLog(@"延迟 2s 执行");  
    176         [GCDHelper gcdPerformBlock:^{  
    177             NSLog(@"执行完毕");  
    178         } onQueue:[GCDHelper gcdMainQueue] delaySecond:2];  
    179     }  
    180       
    181     @end  
     1     #import <UIKit/UIKit.h>  
     2       
     3     @interface MulthreadConcurrentVC : UIViewController  
     4       
     5       
     6     @end  
     7 
     8 
     9 [cpp] view plaincopyprint?
    10 
    11     #import "MulthreadConcurrentVC.h"  
    12       
    13     /* 
    14       
    15      如何在GCD中快速的控制并发呢?答案就是 
    16      dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。 
    17      在GCD中有三个函数是semaphore的操作,分别是: 
    18      dispatch_semaphore_create          创建一个semaphore 
    19      dispatch_semaphore_signal          发送一个信号 
    20      dispatch_semaphore_wait              等待信号 
    21      简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量减少1,根据这样的原理,我们便可以快速的创建一个并发控制。 
    22       
    23      */  
    24       
    25       
    26     /* 
    27       
    28     简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。 
    29       
    30     */  
    31       
    32     @implementation MulthreadConcurrentVC  
    33       
    34     - (void) loadView  
    35     {  
    36         [super loadView];  
    37     }  
    38       
    39     - (void)aSelector:(id)sender  
    40     {  
    41         dispatch_group_t group = dispatch_group_create();  
    42         dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);  
    43         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
    44         for (int i = 0; i < 100; i++)  
    45         {  
    46             dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);  
    47             dispatch_group_async(group, queue, ^{  
    48                 NSLog(@"%i",i);  
    49                 sleep(2);  
    50                 dispatch_semaphore_signal(semaphore);  
    51             });  
    52         }  
    53         dispatch_group_wait(group, DISPATCH_TIME_FOREVER);  
    54         dispatch_release(group);  
    55         dispatch_release(semaphore);  
    56     }  
    57       
    58     - (void)viewDidLoad  
    59     {  
    60         [super viewDidLoad];  
    61           
    62         UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    63         bt.frame = CGRectMake(100, 100, 120, 120);  
    64         [bt addTarget:self action:@selector(aSelector:) forControlEvents:UIControlEventTouchUpInside];  
    65         [self.view addSubview:bt];  
    66     }  

    三、GCD实际应用举例

      1     #import <UIKit/UIKit.h>  
      2       
      3     #import "GCDHelper.h"  
      4       
      5     @interface TableViewController : UITableViewController  
      6       
      7     @end  
      8 
      9 
     10 [cpp] view plaincopyprint?
     11 
     12     #import "TableViewController.h"  
     13     #import "CustomCell.h"  
     14     #import <objc/runtime.h>  
     15       
     16     static char * const kIndexPathAssociationKey = "JK_indexPath";  
     17       
     18     @interface TableViewController ()  
     19       
     20     @end  
     21       
     22     @implementation TableViewController  
     23       
     24     - (id)initWithStyle:(UITableViewStyle)style  
     25     {  
     26         self = [super initWithStyle:style];  
     27         if (self) {  
     28             // Custom initialization  
     29         }  
     30         return self;  
     31     }  
     32       
     33     - (void)viewDidLoad  
     34     {  
     35         [super viewDidLoad];  
     36       
     37         self.clearsSelectionOnViewWillAppear = NO;  
     38         self.navigationItem.rightBarButtonItem = self.editButtonItem;  
     39     }  
     40       
     41     - (void)didReceiveMemoryWarning  
     42     {  
     43         [super didReceiveMemoryWarning];  
     44         // Dispose of any resources that can be recreated.  
     45     }  
     46       
     47     #pragma mark - Table view data source  
     48       
     49     - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
     50     {  
     51         return 1;  
     52     }  
     53       
     54     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
     55     {  
     56         return 100;  
     57     }  
     58       
     59     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
     60     {  
     61         static NSString *CellIdentifier = @"Cell";  
     62         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
     63           
     64         if (cell == nil) {  
     65             cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];  
     66             UIImageView *im = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];  
     67             im.tag = 10;  
     68             [cell addSubview:im];  
     69             [im release];  
     70         }  
     71           
     72         return cell;  
     73     }  
     74       
     75     - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath  
     76     {  
     77     //    http://localhost:8888/Imgs/img0.png  
     78     //    http://theme.blogcn.com/wp-content/themes/coffee-desk/images/rsscoffee.PNG  
     79           
     80         NSString *imgURLStr = nil;  
     81         if ((indexPath.row % 2) == 0)  
     82         {  
     83             imgURLStr = @"http://localhost:8888/Imgs/img0.png";  
     84         } else  
     85         {  
     86             imgURLStr = @"http://localhost:8888/Imgs/img1.png";  
     87         }  
     88           
     89         GCDHelper *hp = [GCDHelper new];  
     90         [hp gcdImageWithURLString:imgURLStr  
     91                        completion:^(id object1, id object2) {  
     92                           
     93                            dispatch_async(dispatch_get_main_queue(), ^{  
     94                                UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];  
     95                                [(UIImageView *)[cell viewWithTag:10] setImage:(UIImage *)object1];  
     96                            });  
     97                        }];  
     98     }  
     99       
    100     #pragma mark - Table view delegate  
    101       
    102     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
    103     {  
    104     }  
    105       
    106     #pragma mark -  
    107     #pragma mark - cell重用  
    108       
    109     - (void)tableViewCellIsPreparingForReuse:(NSNotification *)notification  
    110     {  
    111         if ([[notification object] isKindOfClass:[CustomCell class]]) {  
    112             CustomCell *cell = (CustomCell *)[notification object];  
    113               
    114             objc_setAssociatedObject(cell,  
    115                                      kIndexPathAssociationKey,  
    116                                      nil,  
    117                                      OBJC_ASSOCIATION_RETAIN);  
    118               
    119             [[cell imageView] setImage:nil];  
    120         }  
    121     }  
    122       
    123     @end  
     1     #import <UIKit/UIKit.h>  
     2       
     3     extern NSString * const kJKPrepareForReuseNotification;  
     4       
     5     @interface CustomCell : UITableViewCell  
     6       
     7     @end  
     8 
     9 
    10 [cpp] view plaincopyprint?
    11 
    12     #import "CustomCell.h"  
    13       
    14     NSString * const kJKPrepareForReuseNotification = @"JKCallbacksTableViewCell_PrepareForReuse";  
    15       
    16     @implementation CustomCell  
    17       
    18     - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier  
    19     {  
    20         self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];  
    21         if (self) {  
    22             //如果cell 的图片发生改变,当cell重用的时候,刷新图片  
    23               
    24             [[self imageView] addObserver:self  
    25                                forKeyPath:@"image"  
    26                                   options:NSKeyValueObservingOptionOld  
    27                                   context:NULL];  
    28         }  
    29         return self;  
    30     }  
    31       
    32     - (void)observeValueForKeyPath:(NSString *)keyPath  
    33                           ofObject:(id)object  
    34                             change:(NSDictionary *)change  
    35                            context:(void *)context  
    36     {  
    37         NSLog(@"observeValueForKeyPath");  
    38           
    39         if (object == [self imageView] &&  
    40             [keyPath isEqualToString:@"image"] &&  
    41             ([change objectForKey:NSKeyValueChangeOldKey] == nil ||  
    42              [change objectForKey:NSKeyValueChangeOldKey] == [NSNull null]))  
    43         {  
    44             [self setNeedsLayout];  
    45         }  
    46     }  
    47       
    48     - (void)prepareForReuse  
    49     {  
    50         [[NSNotificationCenter defaultCenter] postNotificationName:kJKPrepareForReuseNotification  
    51                                                             object:self];  
    52           
    53         [super prepareForReuse];  
    54     }  
    55       
    1     #import <Foundation/Foundation.h>  
    2       
    3     @interface NetGuarder : NSObject  
    4       
    5     + (NetGuarder *) shareNetGuarder;  
    6       
    7     @end  
     1     #import "NetGuarder.h"  
     2       
     3     @implementation NetGuarder  
     4       
     5     static NetGuarder *guarder = nil;  
     6       
     7     + (void) getNetConnectMsg  
     8     {  
     9         GCDHelper *hp = [GCDHelper new];  
    10         [hp gcdNetWorkGuarder:@"www.baidu.com" withBlock:^(BOOL flag) {  
    11             if (flag)  
    12             {  
    13                 NSLog(@"Net connect");  
    14             } else  
    15             {  
    16                 NSLog(@"Net not connect");  
    17             }  
    18         }];  
    19     }  
    20       
    21     + (NetGuarder *) shareNetGuarder  
    22     {  
    23         static dispatch_once_t predicate;  
    24         dispatch_once(&predicate, ^{  
    25               
    26             NSLog(@"单例创建");  
    27             guarder = [[self alloc] init];  
    28               
    29             [NetGuarder getNetConnectMsg];  
    30         });  
    31           
    32         return guarder;  
    33     }  
    34       
    35     @end  
    1 #import <UIKit/UIKit.h>  
    2   
    3 @interface URLConViewController : UIViewController <NSURLConnectionDataDelegate>  
    4 {  
    5     IBOutlet UISegmentedControl *segment;  
    6     IBOutlet UILabel *label;  
    7 }  
    8   
    9 @end 
      1     #import "URLConViewController.h"  
      2       
      3     typedef struct _INT  
      4     {  
      5         int t1;  
      6           
      7     }INT_STRUCT;  
      8       
      9     @interface URLConViewController ()  
     10     {  
     11         NSMutableData *receivedData;  
     12         BOOL finished;  
     13     }  
     14       
     15     @end  
     16       
     17     @implementation URLConViewController  
     18       
     19     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  
     20     {  
     21         self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  
     22         if (self)  
     23         {  
     24             receivedData = [[NSMutableData data] retain];  
     25         }  
     26         return self;  
     27     }  
     28       
     29     - (void)viewDidLoad  
     30     {  
     31         [super viewDidLoad];  
     32     }  
     33       
     34     - (void)didReceiveMemoryWarning  
     35     {  
     36         [super didReceiveMemoryWarning];  
     37     }  
     38       
     39     - (void) cleanText  
     40     {  
     41         label.text = @"";  
     42     }  
     43       
     44     - (IBAction)segmentAction:(UISegmentedControl *)sender  
     45     {  
     46         switch (sender.selectedSegmentIndex) {  
     47             case 0:  
     48             {  
     49                 [self sendRequestSync];  
     50                 break;  
     51             }  
     52             case 1:  
     53             {  
     54                 [self sendRequestAsync];  
     55                 break;  
     56             }  
     57             case 2:  
     58             {  
     59                 [self sendRequestAsyncOther];  
     60                 break;  
     61             }  
     62             case 3:  
     63             {  
     64                 [self gcdRequest];  
     65                 break;  
     66             }  
     67                   
     68             default:  
     69                 break;  
     70         }  
     71     }  
     72       
     73     #pragma mark -  
     74     #pragma mark  GCDRequest  
     75       
     76     - (void) gcdRequest  
     77     {  
     78         GCDHelper *hp = [GCDHelper new];  
     79           
     80         [hp gcdHttpRequestWithURL:@"http://localhost:8888/test.php"  
     81                        httpMethod:GCDHelperHttpRequestMethodGET  
     82                            params:[NSDictionary dictionary]  
     83                           timeout:5.0f  
     84                           success:^(NSURLResponse *response, NSError *error, NSData *data) {  
     85                               if (data && (!error))  
     86                               {  
     87                                   label.text = [[data objectFromJSONData] description];  
     88                               }  
     89                                 
     90                           }  
     91                              fail:^(NSURLResponse *response, NSError *error, NSData *data) {  
     92                                  if (error)  
     93                                  {  
     94                                      label.text = [error description];  
     95                                  }  
     96                              }];  
     97     }  
     98       
     99     #pragma mark -  
    100     #pragma mark  sendRequestSync  
    101       
    102     - (void) sendRequestSync  
    103     {  
    104         [self cleanText];  
    105           
    106         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    107           
    108         [request setURL:[NSURL URLWithString:@"http://localhost:8888/test.php"]];  
    109         [request setHTTPMethod:@"GET"];  
    110           
    111         NSError *error = nil;  
    112         NSData *data = [NSURLConnection sendSynchronousRequest:request  
    113                                              returningResponse:nil  
    114                                                          error:&error];  
    115           
    116         if (data && (!error))  
    117         {  
    118             label.text = [[data objectFromJSONData] description];  
    119         }  
    120     }  
    121       
    122     #pragma mark -  
    123     #pragma mark  sendRequestAsync  
    124       
    125     - (void) sendRequestAsync  
    126     {  
    127         finished = NO;  
    128           
    129         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    130         [request setURL:[NSURL URLWithString:@"http://localhost:8888/test1.php"]];  
    131         [request setHTTPMethod:@"GET"];  
    132         [request setCachePolicy:NSURLRequestUseProtocolCachePolicy];  
    133         [request setTimeoutInterval:5.0f];  
    134           
    135         NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request  
    136                                                                       delegate:self  
    137                                                               startImmediately:YES];  
    138           
    139         [connection start];  
    140           
    141     //    但是异步模式下带来了一个新的问题,很多情况下,网络请求不在主线程,或者界面等待网络结果,不在主线程的时候,调用线程如果生命周期over,下面这些可能都没有调用到,导致得不到想要得效果,所以需要在NSURLConnection请求后面加点东西来阻塞  
    142         while(!finished) {  
    143               
    144             [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];  
    145               
    146         }  
    147     }  
    148       
    149     // 收到回应  
    150     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
    151     {  
    152         // 注意这里将NSURLResponse对象转换成NSHTTPURLResponse对象才能去  
    153         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;  
    154           
    155         if ([response respondsToSelector:@selector(allHeaderFields)])  
    156         {  
    157             NSDictionary *dictionary = [httpResponse allHeaderFields];  
    158             NSLog(@"allHeaderFields: %@",dictionary);  
    159         }  
    160         [receivedData setLength:0];  
    161     }  
    162       
    163     // 接收数据  
    164     - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
    165     {  
    166         NSLog(@"get some data");  
    167         [receivedData appendData:data];  
    168     }  
    169       
    170     // 数据接收完毕  
    171     - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
    172     {  
    173         NSString *results = [[NSString alloc] initWithBytes:[receivedData bytes]  
    174                                                      length:[receivedData length]  
    175                                                    encoding:NSUTF8StringEncoding];  
    176           
    177         label.text = [[results objectFromJSONString] description];  
    178           
    179         finished = YES;  
    180     }  
    181       
    182     // 返回错误  
    183     -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
    184     {  
    185         NSLog(@"Connection failed: %@", error);  
    186     }  
    187       
    188     #pragma mark -  
    189     #pragma mark  sendRequestAsyncOther  
    190       
    191     - (IBAction) sendRequestAsyncOther  
    192     {  
    193         [self cleanText];  
    194           
    195         NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];  
    196         [request setURL:[NSURL URLWithString:@"http://localhost:8888/test2.php"]];  
    197         [request setHTTPMethod:@"GET"];  
    198         [request setCachePolicy:NSURLRequestUseProtocolCachePolicy];  
    199         [request setTimeoutInterval:5.0f];  
    200           
    201         [NSURLConnection sendAsynchronousRequest:request  
    202                                            queue:[NSOperationQueue new]  
    203                                completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {  
    204                                      
    205                                    dispatch_async(dispatch_get_main_queue(), ^{  
    206                                        label.text = [[data objectFromJSONData] description];  
    207                                    });  
    208                                      
    209                                }];  
    210     }  
    211       
    212     @end  
     1     #import <Foundation/Foundation.h>  
     2       
     3     /** Simple GCD-based timer based on NSTimer. 
     4      
     5      Starts immediately and stops when deallocated. This avoids many of the typical problems with NSTimer: 
     6      
     7      * RNTimer runs in all modes (unlike NSTimer) 
     8      * RNTimer runs when there is no runloop (unlike NSTimer) 
     9      * Repeating RNTimers can easily avoid retain loops (unlike NSTimer) 
    10     */  
    11       
    12     @interface RNTimer : NSObject  
    13       
    14     /**--------------------------------------------------------------------------------------- 
    15      @name Creating a Timer 
    16      ----------------------------------------------------------------------------------------- 
    17     */  
    18       
    19     /** Creates and returns a new repeating RNTimer object and starts running it 
    20      
    21      After `seconds` seconds have elapsed, the timer fires, executing the block. 
    22      You will generally need to use a weakSelf pointer to avoid a retain loop. 
    23      The timer is attached to the main GCD queue. 
    24      
    25      @param seconds The number of seconds between firings of the timer. Must be greater than 0. 
    26      @param block Block to execute. Must be non-nil 
    27      
    28      @return A new RNTimer object, configured according to the specified parameters. 
    29     */  
    30     + (RNTimer *)repeatingTimerWithTimeInterval:(NSTimeInterval)seconds block:(dispatch_block_t)block;  
    31       
    32       
    33     /**--------------------------------------------------------------------------------------- 
    34      @name Firing a Timer 
    35      ----------------------------------------------------------------------------------------- 
    36     */  
    37       
    38     /** Causes the block to be executed. 
    39      
    40      This does not modify the timer. It will still fire on schedule. 
    41     */  
    42     - (void)fire;  
    43       
    44       
    45     /**--------------------------------------------------------------------------------------- 
    46      @name Stopping a Timer 
    47      ----------------------------------------------------------------------------------------- 
    48     */  
    49       
    50     /** Stops the receiver from ever firing again 
    51      
    52      Once invalidated, a timer cannot be reused. 
    53      
    54     */  
    55     - (void)invalidate;  
    56     @end  
        #import "RNTimer.h"  
          
        @interface RNTimer ()  
        @property (nonatomic, readwrite, copy) dispatch_block_t block;  
        @property (nonatomic, readwrite, assign) dispatch_source_t source;  
        @end  
          
        @implementation RNTimer  
        @synthesize block = _block;  
        @synthesize source = _source;  
          
        + (RNTimer *)repeatingTimerWithTimeInterval:(NSTimeInterval)seconds  
                                              block:(void (^)(void))block {  
          NSParameterAssert(seconds);  
          NSParameterAssert(block);  
          
          RNTimer *timer = [[self alloc] init];  
          timer.block = block;  
          timer.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,  
                                                0, 0,  
                                                dispatch_get_main_queue());  
              
          uint64_t nsec = (uint64_t)(seconds * NSEC_PER_SEC);  
          dispatch_source_set_timer(timer.source,  
                                    dispatch_time(DISPATCH_TIME_NOW, nsec),  
                                    nsec, 0);  
          dispatch_source_set_event_handler(timer.source, block);  
          dispatch_resume(timer.source);  
          return timer;  
        }  
          
        - (void)invalidate {  
          if (self.source) {  
            dispatch_source_cancel(self.source);  
            dispatch_release(self.source);  
            self.source = nil;  
          }  
          self.block = nil;  
        }  
          
        - (void)dealloc {  
          [self invalidate];  
        }  
          
        - (void)fire {  
          self.block();  
        }  
          
          
        @end  


    完整的项目链接:http://pan.baidu.com/share/link?shareid=386371&uk=3674861929

    转载请保留,原文链接:http://write.blog.csdn.net/postedit/8708667

    若发现有不合适或错误之处,还请批评指正,不胜感激。
     
  • 相关阅读:
    渣渣小本求职复习之路每天一博客系列——Java基础(9)
    渣渣小本求职复习之路每天一博客系列——Java基础(8)
    渣渣小本求职复习之路每天一博客系列——Java基础(7)
    渣渣小本求职复习之路每天一博客系列——Java基础(6)
    渣渣小本求职复习之路每天一博客系列——Java基础(5)
    渣渣小本求职复习之路每天一博客系列——Java基础(4)
    渣渣小本求职复习之路每天一博客系列——Java基础(3)
    渣渣小本求职复习之路每天一博客系列——数据结构与常用算法(3)
    redis常用命令
    redis的sets类型
  • 原文地址:https://www.cnblogs.com/zj901203/p/5147405.html
Copyright © 2020-2023  润新知