• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            孔雀開(kāi)發(fā)小屋

            專(zhuān)注并致力于手機(jī)客戶(hù)端開(kāi)發(fā)
            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統(tǒng)計(jì)

            • 隨筆 - 103
            • 文章 - 0
            • 評(píng)論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類(lèi)

            隨筆檔案

            關(guān)注的博客

            朋友的博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            iOS開(kāi)發(fā)筆記之基于鍵值的觀(guān)察者模式(KVO)

            KVO簡(jiǎn)而言之就是:基于鍵值的觀(guān)察者,實(shí)際上就是觀(guān)察者模式。

            Cocoa Framework已經(jīng)為我們提供了這一模式,不需要我們自己來(lái)實(shí)現(xiàn)了。我們只需要按照約定的方式去做就可以了。KVO主要用于用戶(hù)界面交互,當(dāng)多個(gè)View共同使用了同一個(gè)實(shí)體,當(dāng)這個(gè)實(shí)體中的某個(gè)屬性改變時(shí),如果需要更新多個(gè)界面,KVO的作用就發(fā)揮出來(lái)了。


            下面給出一個(gè)簡(jiǎn)單的示例,來(lái)展示如何使用KVO。

            示例下載

            有兩種方式可以在鍵值改變的時(shí)候給觀(guān)察者發(fā)送通知:自動(dòng)方式和手動(dòng)方式。其中自動(dòng)方式是由NSObject提供的一個(gè)默認(rèn)實(shí)現(xiàn),通常情況下,如果你自定義了一個(gè)類(lèi)是從NSObject繼承而來(lái),那么該類(lèi)就已經(jīng)具有了KVO的自動(dòng)通知功能,而且不需要額外的編寫(xiě)代碼。如果需要手動(dòng)控制通知方式,那么需要重寫(xiě)automaticallyNotifiesObserversForKey:方法。在該方法中如果需要手動(dòng)控制通知方式,則將automaticallyNotifiesObserversForKey:返回NO,否則返回YES。

            下面的例子是將openingBalance屬性設(shè)置為手動(dòng)通知方式,其他屬性默認(rèn)為自動(dòng)通知方式

             1+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {
             2    BOOL automatic = NO;
             3    if ([theKey isEqualToString:@"openingBalance"]) {
             4        automatic = NO;
             5    }
             else {
             6        automatic=[super automaticallyNotifiesObserversForKey:theKey];
             7    }

             8    return automatic;
             9}

            10
            11
            12


            手動(dòng)通知方式的好處在于可以減少不必要的通知,比如你可以首先檢測(cè)一下該屬性值是否發(fā)生改變,如果發(fā)生改變則通知,否則不通知,代碼示例如下:

             1- (void)setOpeningBalance:(double)theBalance {
             2
             3    if (theBalance != openingBalance) {
             4
             5        [self willChangeValueForKey:@"openingBalance"];
             6
             7        openingBalance=theBalance;
             8
             9        [self didChangeValueForKey:@"openingBalance"];
            10
            11    }

            12
            13}

            14
            15

            如果一個(gè)單一的操作引發(fā)了多個(gè)屬性值的改變,那么就必須嵌套改變通知。代碼示例如下:

             1- (void)setOpeningBalance:(double)theBalance {
             2
             3    [self willChangeValueForKey:@"openingBalance"];
             4
             5    [self willChangeValueForKey:@"itemChanged"];
             6
             7    openingBalance=theBalance;
             8
             9    itemChanged=itemChanged+1;
            10
            11    [self didChangeValueForKey:@"itemChanged"];
            12
            13    [self didChangeValueForKey:@"openingBalance"];
            14
            15}
             
            16


             

            posted on 2011-07-26 18:53 孔雀 閱讀(6755) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): iOS

            久久精品国产99国产精品| 亚洲中文字幕无码久久2020| 国产免费福利体检区久久| 久久久久久无码国产精品中文字幕 | 久久久一本精品99久久精品66| 精品久久久久中文字幕日本| 国产真实乱对白精彩久久| 99精品国产综合久久久久五月天 | 爱做久久久久久| 人妻无码αv中文字幕久久| 久久99精品久久久久久野外| 色8久久人人97超碰香蕉987| 三级韩国一区久久二区综合| 国产精品久久久久久影院| 久久精品青青草原伊人| 久久久久亚洲AV成人网人人网站 | 亚洲国产成人久久精品动漫| 影音先锋女人AV鲁色资源网久久| 精品久久人人爽天天玩人人妻| 国产精品久久午夜夜伦鲁鲁| 久久99国产精品久久99小说| 久久精品国产72国产精福利| 99久久www免费人成精品| 久久99久久99精品免视看动漫| 久久久亚洲裙底偷窥综合| 亚洲欧美成人久久综合中文网| AA级片免费看视频久久| 久久精品国产亚洲网站| 久久久久亚洲av无码专区| 亚洲第一极品精品无码久久| 久久99精品国产麻豆宅宅| 久久成人小视频| 久久国产欧美日韩精品| 2021最新久久久视精品爱| 久久强奷乱码老熟女网站| 亚洲香蕉网久久综合影视| 国产69精品久久久久9999APGF | 丰满少妇高潮惨叫久久久| 国产精品无码久久综合| 国产精品久久国产精麻豆99网站| 99久久国语露脸精品国产|