×î½ü¿´ÁËһЩÓйØserverµÄ¶«Î÷£¬Ò»Ð©ºÜ¼òµ¥µÄ¶«Î÷£¬²»ÍâºõÊÇһЩÎĵµ¹æ·¶£¬ÁíÍâ½áºÏ×î½ü¿´µÄwwdcµÄһЩvideo£¬¾õµÃ¶ÔÈí¼þ¼Ü¹¹£¨software
architecture£©ÈÏʶÓÖÇå³þÁËһЩ£¬ÕâÀï¼Ç¼ÏÂÀ´¡£
software architecture ÌýÉÏÈ¥ÊÇÒ»¸öºÜ´óµÄ¸ÅÄʵ¼ÊÉÏÒ²°üÀ¨ºÜ¶à¶«Î÷£¬ÀïÃæµÄÕùÒéÒ²ºÜ¶à¡£ÔÚÎÒ¿´À´Èí¼þ¼Ü¹¹×îºÃ·ÅÔÚСµÄ³¡¾°ÖÐÀí½â¡£
ÎÊÌâ1
ÎÒÃÇÓÐ2¸öÒ³Ãæ¡£

1.Ò³ÃæA£ºÖ÷Ò³Ãæ
2.Ò³ÃæB£ºÏêÇéÒ³Ãæ
2¸öÒ³Ãæ·Ö±ðÏÔʾһ¸öÊý×Ö£¬Õâ¸öÊý×ÖÓ¦¸ÃÏàͬ¡£ÏêÇé»áÐÞ¸ÄÕâ¸öÊý×Ö£¬ÕâÀïÎÒÃÇ·¢ÏÖ£¬ÏêÇéÒ³ÃæºÍÖ÷Ò³ÃæÊý×Ö²»Ò»Ñù¡£

Êý¾Ý²»Ò»ÖÂ
ÎÊÌâ1 ½â¾ö·½·¨A
ÕâÀïÊ×Ïȵĸоõ¾ÍÊÇ£¬ÏêÇéÒ³Ãæ·µ»Ø£¬Ö÷Ò³ÃæÊý¾ÝûÓÐˢУ¬µ¼ÖÂÊý¾Ý²»Ò»Ö¡£ ÄÇôFixÕâ¸öBugµÄ·½·¨£¬¾ÍÊÇÔÚÖ÷Ò³Ãæ³öÏÖµÄʱºòˢнçÃæ
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.displayLabel.text = [[CUDataDAO selectData].data stringValue]; } |
ÏÖÔÚÀ´¿´£¬»¹²»´í¡£µ«ÊÇ£¬ÎÒÃǵ÷ÓÃselectDataµÄ´ÎÊýÔò±äµÃ·Ç³£·Ç³£¶à¡£Êý¾Ý²»ÊǾ³£±ä»¯µÄ¡£
ÎÊÌâ1 ½â¾ö·½·¨B
ÎÒÃÇ·¢ÏÖ¼ÈÈ»Êý¾ÝµÄ¸Ä±äÊÇÔÚÒ³ÃæB½øÐеģ¬ÄÇÃ´Ò³ÃæBÐÞ¸ÄÕâ¸öÊý¾ÝµÄʱºò£¬Ó¦¸Ã°ÑÊý¾Ý±ä»¯¡±Í¨Öª¡±¸øÒ³ÃæA£¬ÄÇôÎÒÃÇдÁËÒ»¸öDelegate
@protocol CUDetailViewControllerDelegate <NSObject> - (void)detailVC:(CUDetailViewController *)vc dataChanged:(NSNumber *)data; @end |
ÔÚÒ³ÃæBÐÞ¸ÄÊý¾ÝÖ®ºó£¬Í¨¹ýdelegate ֪ͨ¸øÒ³ÃæA¡£
- (IBAction)changeButtonClicked:(id)sender { int value = arc4random() % 100; [CUDataDAO setData:value]; self.displayLabel.text = [@(value) stringValue]; if ([self.delegate respondsToSelector:@selector(detailVC:dataChanged:)]) { [self.delegate detailVC:self dataChanged:@(value)]; } } |
µ½´Ë³¡¾°1µÃµ½Á˲»´íµÄ½â¾ö¡£
ÎÊÌâ2
ÕâʱÎÒÃÇÔö¼ÓÁËÁíÒ»¸öÒ³ÃæC¡£Õâ¸ö³¡¾°»áÉÔ΢³éÏóÒ»µã£¬ÎÒÃǶ¨ÒåÁË3¸öÊý¾Ý
1.Ò³ÃæAµÄÊý¾ÝdataA
2.Ò³ÃæBµÄÊý¾ÝdataB
3.Ò³ÃæCµÄÊý¾ÝdataC
ÎÊÌâ1ÖÐ dataA = dataB¡£ÔÚÎÊÌâ2ÖÐdataA = dataB + dataC;
ÎÊÌâ2 ½â¾ö·½·¨C
Ò²¾ÍÊÇËµÒ³ÃæCµÄÐ޸ģ¬Ò²»áÓ°ÏìÒ³ÃæAµÄÊý¾Ý£¬ÄÇôÎÒÃÇÊDz»ÊÇҲҪдһ¸öXXXXDelegateÄØ£¿
ÕâʱÎÒÃǵĴóÄÔÐá³öÁËһЩ²»ºÃµÄζµÀ£¬Èç¹ûÔÙÀ´¸öʲôdataD£¬dataE£¬ÎÒÃÇҪдÕâô¶àµÄDelegateô£¿¶ÔÓÚ¶à¶ÔÒ»¡±Í¨Öª¡±ÕâÖÖζµÀ£¬ºÜ×ÔÈ»µÄÏëµ½Á˲»ÓÃDelegate£¬¶øÊÇÓÃNSNotificationÀ´×ö¡£ÈÃÎÒÃÇδÓê³ñçÑһϣ¬¶¨ÒåÒ»¸öNotificaiton
NSString *const kCUDataChangedNotification = @"CUDataChangedNotification"; [[NSNotificationCenter defaultCenter] postNotificationName:kCUDataChangedNotification object:nil userInfo:nil];
|
ÄÇÕâ¸ö±ä»¯broadcastµ½listener£¬¿´ÉÏÈ¥ÊÇÒ»¸öºÜÔÞµÄidea¡£
ÎÊÌâ3
¹ýÁËÒ»¶Îʱ¼ä£¬ÎÒÃÇ·¢ÏÖÎÊÌâ2µÄ·½·¨ÓÐÒ»¸öBug£¬µ±½çÃæÍ£ÔÚÒ³ÃæBµÄʱºò£¬Çл»µ½Ò³ÃæC£¬ÐÞ¸ÄÊý¾Ý£¬BÖÐÔÙ·µ»ØÊ±£¬Êý¾ÝºÍÒ³ÃæAµÄÊý¾Ý²»Ò»Ö¡£

Êý¾Ý²»Ò»ÖÂ
ÄÇÒ²¿ÉÒÔÀà±È½â¾ö·½·¨B£¬µÃµ½ÁËÏÂÃæµÄ·½·¨
½â¾ö·½·¨D
¼ÈÈ»AºÍBµÄÊý¾Ý²»Ò»Ö£¬¶øAµÄÊý¾Ý±ÈBµÄУ¬ÄÇô±£ÁôÒ»¸öBµÄÖ¸Õ룬ȻºóA±ä»¯µÄʱºò£¬¸üÐÂB¾ÍºÃÁË¡£
- (void)handleDataChangedNotification { [self updateLabel]; [self.vc updateLabel]; } // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"push"]) { CUDetailViewController *vc = [segue destinationViewController]; if ([vc isKindOfClass:[CUDetailViewController class]]) { self.vc = vc; } } } |
ÎÊÌâ4
Ò³ÃæCʵÔÚÊÇÌ«¼òµ¥ÁË£¬Õâ´ÎÎÒÃÇÏ£ÍûÔÚÒ³ÃæCÖÐÏÔÊ¾Ò³ÃæAµÄÊý¾Ý¡£ÒòΪÉÏ´ÎÎÒÃǾͲúÉúÁËÒ»¸öÊý¾Ý²»Ò»ÖµÄÎÊÌ⣬Õâ´ÎÎÒÃÇ×¢Òâµ½ÁË£¬ÄÇôÔõôÐÞ¸ÄÄØ£¿
½â¾ö·½·¨E
ÔÚ¿´ÁË¿´Õû¸öAPP¸÷ÖÖ֪֮ͨºó£¬¾õµÃͦÂé·³£¬×¼±¸ÓÃÒ»¸öÈ¡Çɵķ½·¨¡£¿ÉÒÔÀà±È½â¾ö·½·¨A¡£ÔÚÒ³ÃæC³öÏÖµÄʱºò£¬Ë¢ÐÂÊý¾Ý£¬ÖÁÓÚʲôÐÔÄÜÎÊÌ⣬²»¹ÜÁË£¬ÏÈfix
bug¡£
- (void)viewWillAppear:(BOOL)animated { [self updateLabel]; } - (void)updateLabel { int dataB = [[CUDataDAO selectData].data intValue]; int dataC = [[CUDataDAO selectOtherData].data intValue]; self.dataLabel.text = [@(dataB + dataC) stringValue]; } |
ÎÊÌâ5
ÕâʱµÄÊý¾ÝÐèÒª²»¶ÏµÄ±ä»¯£¬ÎÒÃÇÔÚCUDataDAO¼ÓÁËÒ»¸ötimer Ä£ÄâÊý¾Ý±ä»¯£¬Êý¾Ý±ä»¯µÄÔÒò¿ÉÄÜÊÇserver
push һЩÊý¾Ý¡£client ±¾µØÊý¾Ý¿â¸üÐÂÁËÊý¾Ý£¬ÐèÒªÔÚÒ³ÃæA¡¢B¡¢CÖÐÏÔʾ¡£
Ò³ÃæCµÄÊý¾ÝÓÖ²»Ò»ÖÂÁË¡£¡£¡£¡£
ÎÊÌâµ½µ×ÔÚÄÄÀïÄØ
×ßµ½ÕâÀÎÒÃÇÐèÒªÖØÐÂ˼¿¼ÎªÊ²Ã´Õâ¸öÎÊÌâ»á²»¶ÏµÄÖØ¸´³öÏÖÄØ£¿software architecture¾ÍÊÇÀ´½â¾öÕâ¸öÎÊÌâµÄ¡£µ«ÊÇÔÚÌá³öÒ»¸öºÏÀíµÄ·½°¸Ö®Ç°£¬ÏÈ˼¿¼Ò»¸ö¸ÅÄî¡£
ÎÒÃǰÑÊý¾Ý¿âÖеÄÊý¾Ý£¬ÏÔʾµ½ÆÁÄ»ÉÏ£¬»òÊÇ´«µÝ¸øViewʱ£¬Õâ¸ö¹ý³ÌÆäʵÊǶÔdata ×öÁËÒ»´Îcopy¡£¶øÇÒÖ»Òª²»ÊÇͨ¹ýÒýÓûòÊÇÖ¸ÕëÕâЩ·½Ê½£¬Í¨¹ýÖµ´«µÝµÄ·½Ê½¶¼ÊǶÔdata×öÁËÒ»´Îcopy¡£¶øÕâ¸öcopyµÄ¹ý³Ì£¬·Ç³£ÀàËÆCache¡£

ͨ³£½¨Á¢Ò»¸öCache»áÓöµ½2ÖÖÎÊÌâ¡£
1.CacheÇé¿öA: Óëoriginal Data Êý¾Ý²»Ò»Ö£¬Ã»Óм°Ê±¸üÐÂ
2.CacheÇé¿öB: ÖØ¸´½¨Á¢Cache
ÈÃÎÒÃÇÓÃÕâ¸ö˼·À´¿´ÎÒÃǵĽâ¾ö·½°¸
½â¾ö·½·¨A
ÕâÊÇÒ»¸ö·Ç³£µäÐ͵ÄCacheÇé¿öB¡£Êý¾Ý¿âµÄÊý¾Ý²¢Ã»Óб仯£¬µ«ÎÒÃÇÈ´¶à´ÎÖØ¸´¼ÆËãcache
½â¾ö·½·¨B
Ò³ÃæÖ®¼äµÄ¹ØÏµ¿ÉÒÔÓÃÏÂÃæÀ´ÃèÊö

ÕâÀïÎÒÃÇÒþÒþÄܹ»¸Ð¾õµ½ÎÊÌ⣬AµÄÊý¾Ý±ä»¯ÒÀÀµÓÚ2¸öµØ·½¡£²»¼±£¬ÔÙÍùºó¿´
½â¾ö·½·¨C

½â¾ö·½·¨D

ÊÂÇé±äµÃ¸üÔãÁË
½â¾ö·½·¨E
ºÍ½â¾ö·½·¨AÀàËÆ£¬Í¬ÑùµÄÖØ¸´¼ÆËãCacheÎÊÌâ¡£
ʵ¼ÊÉÏÎÊÌ⻹»á¸üÔã
ÏÖÔÚ»¹ÊÇÒ»¸ö¼òµ¥µÄModel£¬Èç¹ûproject±äµÃºÜ´ó£¬ÄÇô¾Í»á±ä³ÉÕâ¸öÑù×Ó

ÿһ¸öX¶¼¿ÉÄÜÊÇÒ»¸öBug¡£
ÎÒÃÇËÆºõÒѾÕÒµ½ÎÊÌâÁË
¡¶Advanced iOS Application Architecture and Patterns¡·
ÖУ¬°ÑÕâ¸öͼ½Ð×öinformation flow¡£ÎÒÃǵÄÖ±¾õ»á¸æËßÎÒÃÇ£¬Õâ¸öÐÅÏ¢µÄ´«µÝ£¬Ó¦¸ÃÊÇ×ÔÉ϶øÏµÄÊ÷»òÊÇÉÁÖ£¬¶øÇÒ×îºÃÊÇÒ»¸ö²ã´Îƽºâ½á¹¹£¬ÒªÇåÎú£¬Ã¿Ò»¸öλÖö¼ÓÐÏà¶ÔÓÚµÄÖ°Ôð¡£ÄÇÎÒÃǾÍÐèÒªÖÆ¶¨Ò»¸ö¹æÔò¡£
ÔÚÏëÕâ¸ö¹æÔò֮ǰ£¬Èç¹û°ÑÉÏÃæµÄͼ±³ºóµÄÊý¾ÝÍü¼Ç£¬ÎÒÃǸоõÕâºÜÀàËÆÄÚ´æÄ£ÐÍ¡£µ±È»ÄÚ´æÄ£ÐÍ»á±È½Ï¸´ÔÓ¡£µ«ÊÇÎÒÃÇ¿ÉÒÔ½è¼øºÜ¶à¡±ÄÚ´æ¹ÜÀíÖеĹæÔò¡±£¬±ÈÈçË´´½¨£¬ËÏú»Ù¡£Í¬Ñù£¬ÔÚÎÒÃǵÄinformation
flowÖУ¬ÎÒÃÇÏ£ÍûË´´½¨Cache£¬Ë¸üÐÂCache±ä»¯
DAOµÄÊý¾Ý¿âËÆºõºÜÄÑ×öÕâ¼þÊÂÇ飬ÎÒÃÇÒýÈëÁËÒ»¸öеÄÔªËØdataSource£¨µ±È»Ëû±¾ÉíÓÖÊÇDAOµÄÒ»¸öCache)¡£ÆäÖÐA¡¢B¡¢C3¸ö¶¼»áÏÔʾÊý¾Ý£¬ÄÇôËûÃÇÓ¦¸ÃÔÚÒ»¸ö²ã¼¶£¬ÆäÖÐB¡¢C»áÐÞ¸ÄÊý¾Ý£¬ËûÃÇ»á°ÑÕâ¸öÊý¾Ý·µ»Ø¸ødataSource£¬¶øÍ¨¹ýdataSourceÀ´°ÑÕâ¸ö±ä»¯Í¨Öªµ½A¡¢B¡¢C¡£

ÕâÑù´øÀ´µÄºÃ´¦ºÜÃ÷ÏÔ£¬ÎÒÃÇÔÙÌí¼ÓÒ»¸öD£¬Ò²²»»á¶ÔÆäËûµØ·½µÄÊý¾Ý²úÉúÈκÎÓ°Ï죬ÎÒÃǵÄUnit Test¡¢MockÒ²¸ü¼ÓºÃд¡£
ÎÒÃÇ֮ǰµÄ˼·´íÔÚÄÄÀïÄØ£¿
´Ó¾Ö²¿À´¿´£¬ÎÒÃÇ֮ǰµÄ˼·¶¼Ã»ÓÐÈκÎÎÊÌ⣬µ«ÊÇÕûÌåÀ´¿´È´°ÑÎÊÌâÒþ²Ø»¯¡£¹Ø¼üµÄÎÊÌâÊÇÔÚÓÚûÓÐÕÒµ½Truth£¬ÕÒµ½ÎÊÌâÕæÕýµÄµØ·½¡£¶øÕÒµ½ÕæÕýµÄµØ·½£¬ÐèÒªÎÒÃÇÔÚ´óÄÔÖÐÓÐÒ»¸öÇåÎúµÄinformation
flow»òÊÇdata flow¡£Á˽âÖ®¼äÔªËØµÄÏ໥¹ØÏµ£¬²ÅÄܽ¨Á¢Ò»¸ö¸öµÄ²ã¡£²ÅÄÜ×øµ½ÕæÕýµÄ½âñî,½âñî²¢²»Êǽö½öÒ»¸ö¸öµÄManager£¬¸üÖØÒªµÄÊǽ¨Á¢Ò»Ì×ÇåÎúµÄflow»úÖÆ£¬»òÊÇÏûÏ¢»úÖÆ£¬Èç¹ûûÓÐÒ»Ì×flow£¬ÖмäÒýÈëµÄ¸÷ÖÖ¸÷ÑùµÄ·½·¨£¬¼´±ãʹÓÃÁ˸÷ÖÖÉè¼ÆÄ£Ê½£¬Õû¸ösoftware
ÒÀÈ»ÊÇÉî¶ÈñîºÏ¡£
ÒÉÎÊ
Õâ¸öAPP¿´ÉÏÈ¥½»»¥·Ç³£¸´ÔÓ
ÉÏÃæµÄmodel£¬ÓÐЩͬѧ»¹¿ÉÄܾõµÃÕâÊǽ»»¥ÉÏÃæµÄÎÊÌ⣬Õâ¸ö½»»¥¿´ÉÏÈ¥·Ç³£µÄ¸´ÔÓ£¬²»ÊÇÒ»¸öºÃÉè¼Æ¡£
ÎÒÕâÀïÁоÙÒ»¸öʵ¼ÊµÄÀý×Ó£º
AÒ³ÃæÒª´´½¨¶¯»£¬¶¯»±³ºó°üÀ¨ºÜ¶àÊý¾Ý£¬ÕâЩÊý¾Ý»áÔÚB£¬CÉõÖÁ¸ü¶àµÄÒ³Ãæ£¬»òÊǺǫ́±»Ð޸ġ£¶¯»±¾Éíʵ¼ÊÉÏÌåÏÖÔÚView£¬¶øÕâЩview¿ÉÄܲ»½ö½öÔÚAÖÐÓУ¬B£¬C¿ÉÄÜÒ²»áÓв¿·ÖµÄView¡£
µ¥ÀýÔõôÑù
µ±È»ÎÒÃÇ¿ÉÒÔÓõ¥ÀýµÄ·¨×Ó¡£µ¥ÀýÊǸöħ¹í£¬±»ºÜ¶àÀÄÓã¬Õâ¸ö³¡¾°Óõ¥Àý£¬Æäʵ½ö½öÊǰÑÈ«¾Ö±äÁ¿ºÏÀíµÄ·â×°ÔÚÁ˵¥ÀýÏ£¬ÒòΪÕâ·ÝÊý¾Ý£¬²¢Ã»ÓÐÈκÎÀíÓÉÒªÒ»¶¨ÊÇÒ»·Ýcopy¡£
recap
ÔÚÁ˽âÕâ¸ö¸ÅÄîºó£¬ÔÙ¿´Ò»Ð©serverµÄ¼Ü¹¹£¬¹æÔòʱ£¬Ò²»á¸üÈÝÒ×Àí½âÕâЩ²ãÖ®¼äµÄ¹ØÏµ¡£°üÀ¨
ΪʲôҪ¹æ¶¨ÄÇЩ²ãÖ®¼ä£¬²»ÄÜÏ໥µ÷Ó㬲»ÄÜÓо²Ì¬·½·¨¡£
Ò»¸ö²ãÖ®¼äµÄmodel£¬²»ÄÜÓÐÖØµþ¹¦ÄÜ£¬²»ÄÜÁ¬±í²éѯ¡£
ÔÚÄĸö²ã²ÅÄܵ÷ÓÃÁíÒ»¸ö·þÎñ£¬¶øµ÷ÓÃÕâ¸ö·þÎñ»¹±ØÐëҪͨ¹ýͳһµÄ½Ó¿Ú
software architecture º¸ÇµÄ¶«Î÷·Ç³£¶à¡£ÕâÆªÖ»ÊÇÒ»¸öÒý×Ó£¬½éÉÜÁËÉè¼ÆÖ®Ç°µÄ×¼±¸¹¤×÷¡£µ«ÊÇÔÚʵ¼Ê¹ý³ÌÖУ¬ÎÒÃǵÄÄ£ÐÍ¿ÉÄÜÒª±ÈÎÒÕâÀïдµÄ»¹Òª¸´ÔӺܶࡣÏÂһƪ»á½éÉÜÒ»ÖÖ²ßÂÔÓÃÀ´´¦Àí¸ü¼Ó¸´ÔÓÄ£Ð͵ÄÇé¿ö¡£
×îºó¸½ÉÏÒ»¸öÍêÕû¹¦ÄÜµÄ demo code
|