• <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>

            孔雀開發小屋

            專注并致力于手機客戶端開發
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            統計

            • 隨筆 - 103
            • 文章 - 0
            • 評論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關注的博客

            朋友的博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            iOS開發筆記之基于鍵值的觀察者模式(KVO)

            KVO簡而言之就是:基于鍵值的觀察者,實際上就是觀察者模式。

            Cocoa Framework已經為我們提供了這一模式,不需要我們自己來實現了。我們只需要按照約定的方式去做就可以了。KVO主要用于用戶界面交互,當多個View共同使用了同一個實體,當這個實體中的某個屬性改變時,如果需要更新多個界面,KVO的作用就發揮出來了。


            下面給出一個簡單的示例,來展示如何使用KVO。

            示例下載

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

            下面的例子是將openingBalance屬性設置為手動通知方式,其他屬性默認為自動通知方式

             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


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

             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

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

             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 孔雀 閱讀(6749) 評論(0)  編輯 收藏 引用 所屬分類: iOS

            超级碰久久免费公开视频| 久久久久亚洲精品日久生情| 99久久成人国产精品免费| 久久中文字幕一区二区| 亚洲伊人久久大香线蕉苏妲己 | 久久国产AVJUST麻豆| 亚洲综合精品香蕉久久网| 精品无码久久久久久午夜| 国产福利电影一区二区三区久久久久成人精品综合 | 亚洲国产成人精品女人久久久| 久久99国产精品久久| 久久天天躁狠狠躁夜夜av浪潮| 四虎亚洲国产成人久久精品| 久久无码人妻一区二区三区午夜 | 欧美亚洲国产精品久久| 91久久国产视频| 久久人人爽人人爽人人片av高请 | 久久久久噜噜噜亚洲熟女综合 | 精品国产热久久久福利| 99999久久久久久亚洲| 亚洲欧美日韩久久精品| 国产国产成人久久精品| 久久天天躁狠狠躁夜夜网站| 久久久噜噜噜久久中文字幕色伊伊| 久久久久成人精品无码中文字幕| 66精品综合久久久久久久| 色婷婷综合久久久久中文一区二区| 久久久久久A亚洲欧洲AV冫 | 久久精品九九亚洲精品| 久久国产色av免费看| 一本色道久久综合| 欧美久久久久久| 久久亚洲精品国产精品婷婷| 久久午夜无码鲁丝片午夜精品| 欧美噜噜久久久XXX| 久久精品无码午夜福利理论片| 青青草原综合久久大伊人导航| 国产精品久久久久jk制服| av无码久久久久不卡免费网站| 日韩欧美亚洲综合久久| 久久精品国产清自在天天线|