Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
OS X ºÍ iOS ÖеĶàÏ̼߳¼Êõ
 
×÷Õߣº¹ù÷ë À´Ô´£ºInfoQ ·¢²¼ÓÚ£º 2014-12-16
  2301  次浏览      27
 

¶àÏ̼߳¼Êõ

ÎÒÃÇΪºÎÐèÒª¶àÏß³ÌÄØ£¿¶àÏß³ÌÆäʵÊÇΪÁËʵÏÖ²¢·¢Ö´ÐУ¬¶øÇÒÏß³ÌÊ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¡£

   
2301 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ