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

若发现有不合适或错误之处,还请批评指正,不胜感激。
 
posted @ 2016-01-21 10:20  蓝色的风1203  阅读(1161)  评论(0编辑  收藏  举报