¶àÏ̼߳¼Êõ
ÎÒÃÇΪºÎÐèÒª¶àÏß³ÌÄØ£¿¶àÏß³ÌÆäʵÊÇΪÁËʵÏÖ²¢·¢Ö´ÐУ¬¶øÇÒÏß³ÌÊDz¢·¢Ö´Ðжà¸ö´úÂë·¾¶µÄ¶àÖÖ¼¼ÊõÖ®ÖбȽÏÇáÁ¿¼¶µÄÒ»ÖÖ£¨¶ÔÓ¦½ÏÖØµÄʵÏÖÊÇ¶à½ø³Ì£©¡£
ÔÚµ¥ºË CPU ʱ´ú£¬Ö§³Ö¶àÏ̵߳IJÙ×÷ϵͳ»áͨ¹ý·ÖÅä CPU ¼ÆËãʱ¼ä£¬À´ÊµÏÖÈí¼þ²ãÃæµÄ¶àÏ̡߳£´´½¨Ị̈߳¬Ï̼߳äÇл»¶¼ÊÇÓгɱ¾¿ªÏúµÄ¡£µ«ÓÉÓÚ¶àÏ߳̿ÉÒÔ±ÜÃâ×èÈûËùÔì³ÉµÄ
CPU ¼ÆËãʱ¼äÀË·Ñ£¬ËùÒÔ¶àÏß³ÌËù´øÀ´µÄ¿ªÏú³É±¾×ÜÌå¿´À´ÊÇÖµµÃµÄ¡£ÈÎÎñÒ»°ã¶¼¿ÉÒÔ±»²ð·Ö³É¶à¸ö×ÓÈÎÎñ£¬Èç¹ûÒ»¸ö×ÓÈÎÎñ·¢ÉúÁË×èÈû£¬¼ÆËãʱ¼ä¾Í¿ÉÒÔ·ÖÅ䏸ÆäËû×ÓÈÎÎñ¡£ÕâÑù¾ÍÌá¸ßÁË
CPU µÄÀûÓÃÂÊ¡£
ÔÚ¶àºË CPU ʱ´ú£¬¾Í¸üºÃÀí½âÁË¡£ÓÉÓÚÓ²¼þÉϾÍÖ§³Ö¶àÏ̼߳¼Êõ£¬¾Í¿ÉÒÔÈöà¸öÏß³ÌÕæÕýͬʱµØÔËÐС£Èç¹ûÈÎÎñÄܹ»±»²ð·Ö£¬¸÷¸ö×ÓÈÎÎñ¾ÍÄܲ¢ÐеØÔÚ
CPU ÉÏÔËÐУ¬Õâ¾ÍÄÜÏÔÖø¼Ó¿ìÔËÐÐËÙ¶È¡£
×ܽá˵À´£¬¶àÏ̵߳ÄÄ¿µÄÊÇ£¬Í¨¹ý²¢·¢Ö´ÐÐÌá¸ß CPU µÄʹÓÃЧÂÊ£¬½ø¶øÌṩ³ÌÐòÔËÐÐЧÂÊ¡£
OS X ºÍ iOS ÊǶàÏ̲߳Ù×÷ϵͳ£¬ËüÃÇ×·Ëæ UNIX ϵͳʹÓÃÁË POSIX Ïß³ÌÄ£ÐÍ¡£OS X
ºÍ iOS ¶¼ÌṩÁËÒ»Ì׵ײãµÄ C ÓïÑÔ POSIX Ïß³Ì API À´´´½¨ºÍ¹ÜÀíÏ̡߳£µ«Êµ¼ÊÓ¦Óÿª·¢ÖУ¬³ý·ÇÐèÒª¿çƽ̨£¬ÎÒÃDz¢²»³£Ö±½ÓʹÓÃ
POSIX Ïß³Ì API£¬¶øÊÇʹÓÃϵͳ»òÓïÑÔÌṩµÄÆäËûһЩ¸üΪ¼òµ¥µÄ·½°¸£¬ÏÂÒ»½ÚÖлáÌÖÂÛËüÃÇ¡£
Objective-C ÖÐʵÏÖ¶àÏß³Ì
performSelectors
NSObject ÌṩÁËÒÔ performSelector Ϊǰ׺µÄһϵÁз½·¨¡£ËüÃÇ¿ÉÒÔÈÃÓû§ÔÚÖ¸¶¨Ïß³ÌÖУ¬»òÕßÁ¢¼´£¬»òÕßÑÓ³ÙÖ´ÐÐij¸ö·½·¨µ÷Óá£Õâ¸ö·½·¨¸øÁËÓû§ÊµÏÖ¶àÏ̱߳à³Ì×î¼òµ¥µÄ·½·¨¡£ÏÂÃæÓÐһЩÀý×Ó£º
ÔÚµ±Ç°Ïß³ÌÖÐÖ´Ðз½·¨£º
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument
afterDelay:(NSTimeInterval)delay
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:
(NSTimeInterval)delay inModes:(NSArray *)modes
|
ÔÚÖ¸¶¨Ïß³ÌÖÐÖ´Ðз½·¨£º
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread
withObject:(id)arg waitUntilDone:(BOOL)wait
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thread withObject:
(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array
|
ÔÚÖ÷Ïß³ÌÖÐÖ´Ðз½·¨£º
- (void)performSelectorOnMainThread: (SEL)selector withObject:(id)argument
waitUntilDone:(BOOL)wait
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg
waitUntilDone:(BOOL)wait modes:(NSArray *)array
|
ÔÚºǫ́Ïß³ÌÖÐÖ´Ðз½·¨£º
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg |
ÕâһϵÁз½·¨¼òµ¥Ò×Ó㬵«Ö»ÌṩÁËÓÐÏ޵öÑ¡Ôñ£ºÖ¸¶¨Ö´Ðеķ½·¨£¨µ«´«Èë·½·¨µÄ²ÎÊýÊýÁ¿ÓÐÏÞÖÆ£©£»Ö¸¶¨ÊÇÔÚµ±Ç°Ị̈߳¬»¹ÊÇÔÚÖ÷Ị̈߳¬»¹ÊÇÔÚºǫ́Ïß³ÌÖ´ÐУ»Ö¸¶¨ÊÇ·ñÐèÒª×èÈûµ±Ç°Ï̵߳ȴý½á¹û¡£
ÀýÈ磬ÒÔÏ´úÂëʹµÃ·½·¨ foo: ÔÚÒ»¸öеĺǫ́Ïß³ÌÖ´ÐУ¬²¢´«ÈëÁË object ²ÎÊý£º
SEL selector £½ @selector(foo:); [self performSelectorInBackground:selector withObject:object]; |
ÒÔÏ´úÂëʹµÃ updateUI ·½·¨ÔÚÖ÷Ïß³ÌÄڵõ½Ö´ÐУ¬²¢ÇÒµ±Ç°Ï̻߳ᱻ×èÈû£¬Ö±µ½Ö÷Ïß³ÌÖ´ÐÐÍê¸Ãº¯Êý£º
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES]; |
NSThread
NSThread ÊÇ OS X ºÍ iOS ¶¼ÌṩµÄÒ»¸öÏ̶߳ÔÏó£¬ËüÊÇÏ̵߳ÄÒ»¸öÇáÁ¿¼¶ÊµÏÖ¡£ÔÚÖ´ÐÐһЩÇáÁ¿¼¶µÄ¼òµ¥ÈÎÎñʱ£¬NSThread
ºÜÓÐÓ㬵«Óû§ÈÔÈ»ÐèÒª×Ô¼º¹ÜÀíÏß³ÌÉúÃüÖÜÆÚ£¬½øÐÐÏ̼߳äͬ²½¡£±ÈÈ磬Ïß³Ì״̬£¬ÒÀÀµÐÔ£¬Ï̼߳äͬ²½µÈÏß³ÌÏà¹ØµÄÖ÷Ìâ
NSThread ¶¼Ã»ÓÐÉæ¼°¡£±ÈÈç£¬Éæ¼°µ½Ï̼߳äͬ²½ÈÔÈ»ÐèÒªÅäºÏʹÓà NSLock£¬NSCondition
»òÕß @synchronized¡£ËùÒÔ£¬Óöµ½¸´ÔÓÈÎÎñʱ£¬ÇáÁ¿¼¶µÄ NSThread ¿ÉÄܲ¢²»ºÏÊÊ¡£
Ìṩһ¸öÄ£Äâ¶àÏß³ÌÔË×÷µÄ¼òµ¥Àý×Ó£ºÁ½¸öÈËͬʱһÆðµ½¿¾ÏäÇÀÃæ°ü¡£ÎÒÃÇÆô¶¯Á½¸öỊ̈߳¬À´´ú±íÁ½¸öÈË¡£ÓÉÓÚ¿¾ÏäÃűȽÏС£¬Í¬Ê±Ö»ÄÜÓÐÒ»¸öÈËÈ¥ÄÃÃæ°ü¡£ÓÉÓÚ
NSThread ²»´¦ÀíÏß³Ìͬ²½£¬ËùÒÔΪÁËÄ£ÄâÕâ¸ö¹ý³Ì£¬ Ä㻹ÐèÒªÒ»°ÑÏß³ÌËø£¨¼´ÀàÐÍΪ NSLock µÄʵÀý±äÁ¿
_lock£©¡£ÔÚºóÃæµÄ run ·½·¨ÖлáÓõ½Õâ°ÑÏß³ÌËø£º
_lock = [[NSLock alloc] init];
NSThread *geroge = [[NSThread alloc] itWithTarget:self selector:
@selector(run) object:nil];
[geroge setName:@"Geroge"];
[geroge start];
NSThread *totty = [[NSThread alloc] nitWithTarget:self selector:
@selector(run) object:nil];
[totty setName:@"Totty"];
[totty start];
|
Êܵ½Ïß³ÌËø±£»¤µÄÄÃÃæ°ü¹ý³Ì¿ÉÒÔÓÃÏÂÃæµÄ run ·½·¨±íʾ£º
- (void)run {
while (TRUE) {
[_lock lock];
if(_cake > 0){
[NSThread sleepForTimeInterval:0.5];
_cake--;
_occupied = kSum - _cake;
NSLog(@"Taken by %@\nCurrent free:%ld, occupied:
%ld", [[NSThread currentThread] name], _cake, _occupied);
}
[_lock unlock];
}
}
|
NSOperation
NSOperation ×öµÄÊÂÇé±È NSThread ¸ü¶àһЩ¡£Í¨¹ý¼Ì³Ð NSOperation£¬¿ÉÒÔʹ×ÓÀà»ñµÃһЩÏß³ÌÏà¹ØµÄÌØÐÔ£¬½ø¶ø¿ÉÒÔ°²È«µØ¹ÜÀíÏß³ÌÉúÃüÖÜÆÚ¡£±ÈÈ磬ÒÔḬ̈߳²È«µÄ·½Ê½½¨Á¢×´Ì¬£¬È¡ÏûÏ̡߳£ÅäºÏ
NSOperationQueue£¬¿ÉÒÔ¿ØÖÆÏ̼߳äµÄÓÅÏȼ¶ºÍÒÀÀµÐÔ¡£Õâ¾Í¸ø³öÁËÒ»Ì×Ï̹߳ÜÀíµÄ»ù±¾·½·¨¡£
NSOperation ´ú±íÁËÒ»¸ö¶ÀÁ¢µÄ¼ÆËãµ¥Ôª¡£Ò»°ã£¬ÎÒÃÇ»á°Ñ¼ÆËãÈÎÎñ·â×°½ø NSOperation
Õâ¸ö¶ÔÏó¡£NSOperation ÊdzéÏóÀ࣬µ«Í¬Ê±Ò²ÌṩÁËÁ½¸ö¿ÉÒÔÖ±½ÓʹÓõÄʵÌå×ÓÀࣺNSInvocationOperation
ºÍ NSBlockOperation¡£NSInvocationOperation ÓÃÓÚ½«¼ÆËãÈÎÎñ·â×°½ø·½·¨£¬NSBlockOperation
ÓÃÓÚ½«¼ÆËãÈÎÎñ·â×°½ø block¡£
NSOperationQueue ÔòÓÃÓÚÖ´ÐмÆËãÈÎÎñ£¬¹ÜÀí¼ÆËãÈÎÎñµÄÓÅÏȼ¶£¬´¦Àí¼ÆËãÈÎÎñÖ®¼äµÄÒÀÀµÐÔ¡£NSOperation
±»Ìí¼Óµ½ NSOperationQueue ÖÐÖ®ºó£¬¶ÓÁлᰴÓÅÏȼ¶ºÍ½øÈë˳Ðòµ÷¶ÈÈÎÎñ£¬NSOperation
¶ÔÏó»á±»×Ô¶¯Ö´ÐС£
ÈÔȻʹÓÃÉÏÒ»½Ú NSThread ÖеÄÄ£ÄâÁ½ÈËÇÀÃæ°üµÄÀý×Ó¡£ÓÉÓÚ¼ÆËãÈÎÎñûÓб仯£¬ËùÒÔ run ·½·¨²¢²»¸Ä±ä¡£µ«ÕâÀïÐèҪʹÓÃ
NSOperation ºÍ NSOperationQueue À´´ú±íÁ½¸öÇÀÃæ°üµÄÈË£¬²¢¸øÓèËûÃDz»Í¬µÄÓÅÏȼ¶¡£ÓÉÓÚ
NSOperation Ò²²»´¦ÀíÏ̼߳äͬ²½ÎÊÌ⣬ËùÒÔÄãÈÔÈ»ÐèÒªÒ»°ÑÔÚ run ·½·¨ÖлáÓõ½µÄÏß³ÌËø£º
_lock = [[NSLock alloc] init];
NSInvocationOperation *geroge = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(run:) object:@"Geroge"];
geroge.queuePriority = NSOperationQueuePriorityHigh;
NSInvocationOperation *operationTwo = [[NSInvocationOperation alloc]initWithTarget:self
selector:@selector(run:) object:@"Totty"];
totty.queuePriority = NSOperationQueuePriorityLow;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:2];
[queue addOperation:geroge];
[queue addOperation:totty];
|
NSOperation ÌṩÒÔÏÂÈÎÎñÓÅÏȼ¶£¬ÒÔÕâЩÓÅÏȼ¶ÉèÖñäÁ¿ queuePriority ¼´¿É¼Ó¿ì»òÕßÍÆ³Ù²Ù×÷µÄÖ´ÐУº
1¡¢NSOperationQueuePriorityVeryHigh
2¡¢NSOperationQueuePriorityHigh
3¡¢NSOperationQueuePriorityNormal
4¡¢NSOperationQueuePriorityLow
5¡¢NSOperationQueuePriorityVeryLow
NSOperation ʹÓÃ״̬»úÄ£ÐÍÀ´±íʾ״̬¡£Í¨³££¬Äã¿ÉÒÔʹÓà KVO£¨Key-Value
Observing£©¹Û²ìÈÎÎñµÄÖ´ÐÐ״̬¡£ÕâÊÇÆäËû¶àÏ̹߳¤¾ßËù²»¾ß±¸µÄ¹¦ÄÜ¡£NSOperation ÌṩÒÔÏÂ״̬£º
1¡¢isReady
2¡¢isExecuting
3¡¢isFinished
NSOperation ¶ÔÏóÖ®¼äµÄÒÀÀµÐÔ¿ÉÒÔÓÃÈçÏ´úÂë±íʾ£º
[refreshUIOperation addDependency:requestDataOperation]; [operationQueue addOperation:requestDataOperation]; [operationQueue addOperation:refreshUIOperation]; |
³ý·Ç requestDataOperation µÄ״̬ isFinished ·µ»Ø YES£¬²»È» refreshUIOperation
Õâ¸ö²Ù×÷²»»á¿ªÊ¼¡£
NSOperation »¹ÓÐÒ»¸ö·Ç³£ÓÐÓù¦ÄÜ£¬¾ÍÊÇ¡°È¡Ïû¡±¡£ÕâÊÇÆäËû¶àÏ̹߳¤¾ß£¨°üÀ¨ºóÃæÒª½²µ½µÄ GCD£©¶¼Ã»Óеġ£µ÷ÓÃ
NSOperation µÄ cancel: ·½·¨¼´¿ÉÈ¡Ïû¸ÃÈÎÎñ¡£µ±ÄãÖªµÀÕâ¸öÈÎÎñûÓбØÒªÔÙÖ´ÐÐÏÂȥʱ£¬¾¡Ô簲ȫµØÈ¡ÏûËü½«ÓÐÀûÓÚ½Úʡϵͳ×ÊÔ´¡£
GCD
GCD£¨Grand Central Dispatch£©ÊÇ Apple ¹«Ë¾ÎªÁËÌá¸ß OS X ºÍ iOS
ϵͳÔÚ¶àºË´¦ÀíÆ÷ÉÏÔËÐв¢ÐдúÂëµÄÄÜÁ¦¶ø¿ª·¢µÄһϵÁÐÏà¹Ø¼¼Êõ£¬ËüÌṩÁ˶ÔÏ̵߳ĸ߼¶³éÏó¡£GCD ÊÇÒ»ÕûÌ×¼¼Êõ£¬°üº¬ÁËÓïÑÔ¼¶±ðµÄй¦ÄÜ£¬ÔËÐÐʱ¿â£¬ÏµÍ³¼¶±ðµÄÓÅ»¯£¬ÕâЩһÆðΪ²¢·¢´úÂëµÄÖ´ÐÐÌṩÁËϵͳ¼¶±ðµÄ¹ã·ºÓÅ»¯¡£ËùÒÔ£¬GCD
Ò²ÊÇ Apple ÍÆ¼öµÄ¶àÏ̱߳à³Ì¹¤¾ß¡£
GCD ÊÇϵͳ²ãÃæµÄ¼¼Êõ£¬³ýÁË¿ÉÒÔ±»ÏµÍ³¼¶Ó¦ÓÃʹÓã¬Ò²¿ÉÒÔ±»¸üÆÕͨµÄ¸ß¼¶Ó¦ÓÃʹÓá£Ê¹Óà GCD Ö®ºó£¬Ó¦ÓþͿÉÒÔÇáËɵØÔÚ¶àºËϵͳÉϸßЧÔËÐв¢·¢´úÂ룬¶ø²»Óÿ¼ÂÇ·±ËöµÄµ×²ãÎÊÌâ¡£GCD
ÔÚϵͳ²ãÃæ¹¤×÷£¬ÄܺܺõØÂú×ãËùÓÐÓ¦ÓõIJ¢ÐÐÔËÐÐÐèÇ󣬽«¿ÉÓÃϵͳ×ÊԴƽºâµØ·ÖÅ䏸ËüÃÇ¡£
GCD ÌṩÁËÒ»Ì×´¿ C API¡£µ«ÊÇ£¬ËüÌṩµÄ API ¼òµ¥Ò×Óò¢ÇÒÓй¦ÄÜÇ¿´óµÄÈÎÎñ¹ÜÀíºÍ¶àÏ̱߳à³ÌÄÜÁ¦¡£GCD
ÐèÒªºÍ blocks£¨Objective£C µÄ±Õ°ü£©ÅäºÏʹÓá£block ÊÇ GCD Ö´Ðе¥Ôª¡£GCD
µÄÈÎÎñÐèÒª±»²ð½âµ½ block ÖС£block ±»ÅÅÈë GCD µÄ·Ö·¢¶ÓÁУ¬GCD »áΪÄãÅÅÆÚÔËÐС£GCD
´´½¨£¬ÖØÓã¬Ïú»ÙỊ̈߳¬»ùÓÚϵͳ×ÊÔ´ÒÔËüÈÏΪºÏÊʵķ½Ê½ÔËÐÐÿ¸ö¶ÓÁС£ËùÒÔ£¬Óû§ÐèÒª¹ØÐĵÄϸ½Ú²¢²»¶à¡£
GCD µÄʹÓÃÒ²ºÜ¼òµ¥£¬¼ÙÉèÇÀÃæ°üÊǸöºÄʱ²Ù×÷£¬Ç°ÃæÀý×ÓÖÐµÄ Geroge ºÍ Totty µÄ¹¤×÷¶¼¿ÉÒÔʵÏÖÈçÏ£º
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// ²¢·¢¶ÓÁÐÖÐ×öºÄʱ²Ù×÷
while (TRUE) {
if(_cake > 0) {
// ºÄʱ²Ù×÷
[NSThread sleepForTimeInterval:0.5];
_cake--;
_occupied = kSum - _cake;
} else {
break;
}
}
// Ö÷¶ÓÁÐÖÐˢнçÃæ
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI];
});
});
|
GCD ·Ö·¢¶ÓÁÐ
GCD ·Ö·¢¶ÓÁÐÊÇÖ´ÐÐÈÎÎñµÄÓÐÁ¦¹¤¾ß¡£Ê¹Ó÷ַ¢¶ÓÁУ¬Äã¿ÉÒÔÒì²½»òÕß×èÈûÖ´ÐÐÈÎÒâ¶à¸ö block µÄ´úÂë¡£Äã¿ÉÒÔʹÓ÷ַ¢¶ÓÁÐÀ´Ö´Ðм¸ºõÈκÎÏß³ÌÈÎÎñ¡£GCD
ÌṩÁ˼òµ¥Ò×ÓõĽӿڡ£
ÔÚ GCD ÖдæÔÚÈýÖÖ¶ÓÁУº
1 ´®Ðзַ¢¶ÓÁУ¨Serial dispatch queue£©
´®Ðзַ¢¶ÓÁÐÓÖ±»³ÆÎªË½Óзַ¢¶ÓÁУ¬°´Ë³ÐòÖ´ÐжÓÁÐÖеÄÈÎÎñ£¬ÇÒͬһʱ¼äÖ»Ö´ÐÐÒ»¸öÈÎÎñ¡£´®Ðзַ¢¶ÓÁг£ÓÃÓÚʵÏÖͬ²½Ëø¡£ÏÂÃæ´úÂë´´½¨ÁËÒ»¸ö´®Ðзַ¢¶ÓÁУº
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.MyQueue", NULL); |
2 ²¢·¢·Ö·¢¶ÓÁУ¨Concurrent dispatch queue£©
´®Ðзַ¢¶ÓÁÐÓÖ±»³ÆÎªÈ«¾Ö·Ö·¢¶ÓÁУ¬Ò²°´Ë³ÐòÖ´ÐжÓÁÐÖеÄÈÎÎñ£¬µ«ÊÇ˳Ðò¿ªÊ¼µÄ¶à¸öÈÎÎñ»á²¢·¢Í¬Ê±Ö´ÐС£²¢·¢·Ö·¢¶ÓÁг£ÓÃÓÚ¹ÜÀí²¢·¢ÈÎÎñ¡£ÏÂÃæ´úÂë´´½¨ÁËÒ»¸ö²¢·¢·Ö·¢¶ÓÁУº
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); |
3 Ö÷·Ö·¢¶ÓÁУ¨Main dispatch queue£©
Ö÷·Ö·¢¶ÓÁÐÊÇÒ»¸öÈ«¾ÖΨһµÄÌØÊâµÄ´®Ðзַ¢¶ÓÁС£¶ÓÁÐÖеÄÈÎÎñ»á±»ÔÚÓ¦ÓõÄÖ÷Ïß³ÌÖÐÖ´ÐС£Ö÷·Ö·¢¶ÓÁпÉÒÔÓÃÓÚÖ´ÐÐ
UI Ïà¹ØµÄ²Ù×÷¡£È¡µÃÖ÷·Ö·¢¶ÓÁеķ½·¨£º
dispatch_queue_t mainQueue = dispatch_get_main_queue(); |
GCD ÈÎÎñÖ´Ðз½Ê½
GCD ÖÐÓÐÁ½ÖÖÈÎÎñÖ´Ðз½Ê½£º
Òì²½Ö´ÐÐ, dispatch_async£¬Òâ潫ÈÎÎñ·ÅÈë¶ÓÁÐÖ®ºó£¬Ö÷Ï̲߳»»áµÈ´ý
block µÄ·µ»Ø½á¹û£¬¶øÊÇÁ¢¼´¼ÌÐøÖ´ÐÐÏÂÈ¥¡£×èÈûÖ´ÐÐ, dispatch_sync£¬Òâ潫ÈÎÎñ·ÅÈë¶ÓÁÐÖ®ºó£¬Ö÷Ï̱߳»×èÈû£¬ÐèÒªµÈ´ý
block µÄÖ´Ðнá¹û·µ»Ø£¬²ÅÄܼÌÐøÖ´ÐÐÏÂÈ¥¡£
GCD µÄÆäËûÖ÷Ìâ
GCD ÓÐ×ŷḻµÄ¹¦ÄÜ£¬±ÈÈç·Ö·¢×飨dispatch group£©£¬Ðźţ¨semaphores£©£¬·Ö·¢Õ¤À¸£¨dispatch
barrier£©£¬·Ö·¢Ô´£¨dispatch source£©µÈµÈ¡£ÕâЩ¿ÉÒÔÓÃÓÚÍê³É¸ü¸´ÔӵĶàÏß³ÌÈÎÎñ¡£Ïêϸ¿ÉÒÔ²éÔÄ
Apple ¹ØÓÚ GCD µÄÎĵµ¡£
ʹÓý¨Òé
1¡¢ÔÚÄܹ»Ê¹Óà GCD µÄµØ·½£¬¾¡Á¿Ê¹Óà GCD
Apple ¹«Ë¾Ðû³ÆÆäÔÚ GCD ¼¼ÊõÖÐΪ¸üºÃµØÀûÓöàºËÓ²¼þϵͳ×öÁ˺ܶàµÄÓÅ»¯¡£ËùÒÔ£¬ÔÚÐÔÄÜ·½Ãæ GCD
ÊDz»Óõ£Ðĵġ£¶øÇÒ GCD Ò²ÌṩÁËÏ൱·á¸»µÄ API£¬¼¸ºõ¿ÉÒÔÍê³É¾ø´ó²¿·ÖÏß³ÌÏà¹ØµÄ±à³ÌÈÎÎñ¡£ËùÒÔ£¬ÔÚ¶àÏß³ÌÏà¹ØÖ÷ÌâµÄ±à³ÌÖУ¬GCD
Ó¦¸ÃÊÇÊ×Ñ¡¡£ÏÂÃæ¾ÙһЩ¿ÉÒÔÍÆ¼öʹÓà GCD µÄʵ¼ÊÀý×Ó£º
1 ʹÓà GCD µÄ dispatch queue ʵÏÖͬ²½Ëø
ͬ²½ËøµÄʵÏÖ·½°¸Óв»ÉÙ£¬±ÈÈ磬Èç¹û½ö½öÊÇÏë¶Ôij¸öʵÀý±äÁ¿µÄ¶Áд²Ù×÷¼ÓËø£¬¿ÉÒÔʹÓÃÊôÐÔ£¨property£©µÄ
atomic ²ÎÊý£¬¶ÔÓÚÒ»¶Î´úÂë¼ÓËø¿ÉÒÔʹÓà @synchronized ¿é£¬»òÕß NSLock¡£
@synchronized ºÍ NSLock ʵÏÖµÄͬ²½Ëø£º
// Method 1
- (void)synchronizedMethod {
@synchronized(self) {
// safe
}
}
// Method 2
_lock = [[NSLock alloc] init];
- (void)synchronizedMethod {
[_lock lock];
// Safe
[_lock unlock];
}
|
@synchronized Ò»°ã»áÒÔ self Ϊͬ²½¶ÔÏó¡£Öظ´µ÷Óà @synchronized(self)
ÊǺÜΣÏյġ£Èç¹û¶à¸öÊôÐÔÕâô×ö£¬Ã¿Ò»¸öÊôÐÔ½«»á±»ºÍÆäËüËùÓÐÊôÐÔͬ²½£¬Õâ¿ÉÄܲ¢²»ÊÇÄãËùÏ£ÍûµÄ£¬¸üºÃµÄ·½·¨ÊÇÿ¸öÊôÐÔµÄËø¶¼ÊÇÏ໥¶ÀÁ¢µÄ¡£
ÁíÒ»ÖÖ·½·¨ÊÇʹÓà NSLock ʵÏÖͬ²½Ëø£¬Õâ¸ö·½·¨²»´í£¬µ«ÊÇȱµãÊÇÔÚ¼«¶Ë»·¾³ÏÂͬ²½¿é¿ÉÄܻᵼÖÂËøËÀ£¬¶øÇÒÕâÖÖÇé¿öÏ´¦ÀíËøËÀ״̬»áÓÐÂé·³¡£
Ò»¸öÌæ´ú·½·¨ÊÇʹÓà GCD µÄ·Ö·¢¶ÓÁС£½«¶ÁºÍд·Ö·¢µ½Ïàͬ²¢·¢¶ÓÁÐÖУ¬ÕâÑù¶Á²Ù×÷»áÊDz¢·¢µÄ£¬¶à¸öÏ߳̿ÉÒÔͬʱִÐÐд²Ù×÷£»¶ø¶ÔÓÚд²Ù×÷£¬ÒÔ·Ö·¢Õ¤À¸£¨dispatch
barrier£©±£Ö¤Í¬Ê±Ö»ÓÐÒ»¸öÏ߳̿ÉÒÔÖ´ÐÐд²Ù×÷£¬²¢ÇÒÓÉÓÚд²Ù×÷ÎÞÐè·µ»Ø£¬Ð´²Ù×÷»¹ÊÇÒì²½ÂíÉÏ·µ»ØµÄ¡£ÕâÑù£¬¾ÍµÃµ½ÁËÒ»¸ö¸ßЧÇÒḬ̈߳²È«µÄËø¡£´úÂë¿´ÆðÀ´»áÏñÕâÑù£º
_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- (NSInteger)cake {
__block NSInteger localCake;
dispatch_sync(_syncQueue, ^{
localCake = _cake;
});
return localCake;
}
- (void)setCake:(NSInteger)cake {
dispatch_barrier_async(_syncQueue, ^{
_cake = cake;
});
}
|
¼òµ¥¶øÑÔ£¬ÉÏÃæµÄ´úÂë¿ÉÒÔʹ¶Á²Ù×÷±»¾ºÕùÖ´ÐУ»Ð´²Ù×÷±»»¥³âÖ´ÐУ¬²¢ÇÒÒì²½·µ»Ø¡£Ê¹Óà GCD ʵÏÖµÄÕâ¸öͬ²½ËøÓ¦¸ÃÊÇЧÂÊ×îÓÅÇÒ×ȫµÄ¡£
2 ʹÓà GCD Ìæ´ú performSelector ϵÁз½·¨
NSObject µÄ performSelector ϵÁз½·¨ÓкܶàÏÞÖÆ¡£´«¸øÒªÖ´Ðеķ½·¨µÄ²ÎÊýµÄÊýÁ¿ÊÇÓÐÏÞÖÆµÄ£¬Ò²Ã»·¨·½·¨±£Ö¤ÄÜÕýÈ·µØÈ¡µÃÒªÖ´Ðеķ½·¨µÄ·µ»ØÖµ¡£ÕâЩÏÞÖÆÔÚʹÓÃ
block µÄ GCD Öж¼²»´æÔÚ¡£
ÏÂÃæÊÇʹÓà GCD Ìæ´ú performSelector µÄÀý×Ó¡£Ê¹Óà performSelector
ϵÁз½·¨£º
[self performSelector:@selector(cake) withObject:nil afterDelay:5.0]; |
ʹÓà GCD Íê³ÉÏàͬµÄÊÂÇ飺
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)); dispatch_after(time, dispatch_get_main_queue(), ^(void){ [self cake]; }); |
3 ʹÓà dispatch_once ʵÏÖḬ̈߳²È«µ¥Ò»Ö´ÐÐÒªÇó
Ḭ̈߳²È«µ¥Ò»Ö´ÐеäÐÍÀý×ÓÊǵ¥Àý£¬GCD µÄ dispatch_once Äܹ»±£Ö¤´«ÈëµÄ block ±»Ḭ̈߳²È«µØÎ¨Ò»Ö´ÐУº
+ (id)sharedInstance {
static AdivseDemoController *sharedInstance = nil;
static dispatch_once_t onceToken = @"token";
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
|
ÕâÊÇÏÖÔÚ Objective-C ÖÐʵÏÖµ¥Àý½ÏÎªÍÆ¼öµÄÒ»ÖÖ·½·¨¡£
2¡¢ÔÚÐèÒª¸üϸÁ£¶È¿ØÖÆÏß³Ìʱ£¬¿¼ÂÇ NSOperation
GCD ËäÈ»ÔÚºÜ¶àµØ·½ÖµµÃÌᳫ£¬µ«²¢²»ÊÇÈÎÎñ¹ÜÀíºÍ¶àÏ̵߳ØÎ¨Ò»½â¾ö·½°¸£¬²¢²»ÊÇ˵ËùÓеĵط½¶¼Ó¦¸ÃʹÓÃ
GCD¡£GCD ÊÇÒ»¸ö´¿ C API£¬NSOperation ÊÇ Objective-C À࣬ÔÚһЩµØ·½¶ÔÏó±à³ÌÊÇÓÐÓÅÊÆµÄ¡£NSOperation
Ò²ÌṩÁËһЩ GCD ÎÞ·¨ÊµÏÖ£¬»òÕß GCD ËùûÓеŦÄÜ¡£
ÒÔÏÂÊÇÄãÐèÒª¿¼ÂÇʹÓà NSOperation µÄһЩÀíÓÉ£º
µ±ÄãÐèҪȡÏûÏß³ÌÈÎÎñʱ£¬GCD ÎÞ·¨ÌṩȡÏûÈÎÎñµÄ²Ù×÷¡£¶ø NSOperation
ÌṩÁËÈ¡ÏûÈÎÎñµÄ²Ù×÷;
µ±ÄãÐèÒª¸üϸµÄÁ£¶ÈµØ¹Û²ìÈÎÎñ¸Ä±äÁË״̬ʱ£¬ÓÉÓÚ NSOperation
ÊÇÒ»¸ö¶ÔÏó£¬±È½Ï GCD ʹÓÃµÄ block ¶øÑÔ£¬Í¨¹ý¶Ô NSOperation ¶ÔÏó½øÐмüÖµ¹Û²ì£¨KVO£©ÄܺÜÈÝÒ׹۲쵽ÈÎÎñµÄ״̬¸Ä±ä;
µ±ÄãÐèÒªÖØÓÃÏß³ÌÈÎÎñʱ£¬NSOperation ×÷Ϊһ¸öÆÕͨµÄ Objective-C
¶ÔÏ󣬿ÉÒÔ´æ´¢ÈκÎÐÅÏ¢¡£¶ÔÏó¾ÍÊÇÎªÖØÓöøÉè¼ÆµÄ£¬Õâʱ£¬NSOperation ±È GCD ʹÓÃµÄ block
Òª¸ü·½±ã¡£
×ܽá
OS X ºÍ iOS ϵͳÌṩÁ˷ḻµÄ¶àÏ̹߳¤¾ß¡£ÕâЩ¹¤¾ßÖУ¬×îÐÂ×îÏÖ´úµÄÊÇ GCD£¨Grand Central
Dispatch£©¡£GCD Ò²ÊÇ Apple ¹«Ë¾ÍƼöµÄ¶àÏ߳̽â¾ö·½°¸¡£ËùÒÔ£¬¶ÔÓÚ¶àÏ̼߳¼ÊõµÄÑ¡Ôñ£¬×ܽáÏÂÀ´ÓÐÕâÁ½Ìõ½¨Ò飺
1.Äܹ»Ê¹Óà GCD µÄµØ·½£¬¾¡Á¿Ê¹Óà GCD£»
2.ÔÚÐèÒª¸üϸÁ£¶È¿ØÖÆÏß³Ìʱ£¬¿¼ÂÇ NSOperation¡£
|