[ SWIFT ] - 史丹福 StandFord-CS193P-課程13-心得分享-20150911

[ SWIFT ] - 史丹福 StandFord-CS193P-課程13-心得分享-20150911
課程重點:
(1)Application Lifecycller: App生命週期。
(2)Core Motion:提供加速器、陀螺儀和磁力儀等儀器資訊。
(3)Persistence:持久性 或稱 維持化(有很多不同翻譯名稱),泛指將資料儲存於硬碟中。

(1)Application Lifecycller App生命週期 
說明:iOS App 透過5大狀態(Not Running 、 Inactive 、 Active 、 Background 和 Suspended )代表不同的執行階段,狀態改變時透過Delegate 元件,進行適當操作。
5大狀態:
Not Running :app尚未執行
Inactive:app在foreground(前台)執行但沒有接收事件
Active:app在foreground(前台)執行並已開始接收事件
Background:app在background(後台運行)仍在執行程式
Suspended:app在background(後台運行)但沒有執行程式
   
此外主要有七種與 Foreground 和 Background 不同狀態切換相關的基本操作,分別介紹如下:
    大多數發生狀態轉換時都會調用delegate對象對應的方法來響應app的狀態改變。下面匯總了delegate對象的所有方法,當app狀態發生轉換時,你可能會使用到它們。

    application:willFinishLaunchingWithOptions: - 這個方法是你在啓動時的第一次機會來執行代碼application:didFinishLaunchingWithOptions: - 這個方法允許你在顯示app給用戶之前執行最後的初始化操作
    applicationDidBecomeActive: - app已經切換到active狀態後需要執行的操作applicationWillResignActive: - app將要從前台切換到後台時需要執行的操作applicationDidEnterBackground: - app已經進入後台後需要執行的操作applicationWillEnterForeground: - app將要從後台切換到前台需要執行的操作,但app還不是active狀態
    applicationWillTerminate: - app將要結束時需要執行的操作
     

    ※注意事項:NSNotification以及期運作方式屬於MVC中重要的一部分,從Model到Controller的通訊來找出Model中改變的部分。
     NSNotification
    Class NSNotificationCenter中有一個函數defaultCenter類似共享消息中心,透過addObserverForName來指定想收聽的電台名稱addObserverForName參數介紹:(1)String:電台名稱(2)Object:發送廣播者,誰對電台發送的廣播有興趣?如果需要發送給所有人則填入nil(3)queue:隊列,執行後要回到哪個隊列,如果是nil則回到主隊列中!!

    NSOperationQueue中dispath_queue_t可指定想要的隊列,類似一個分發工作中頂端的面向對象的API

    在queue中指定想要的隊列後若想發送通知將執行閉包。
    notification中有許多字典,其中最重要的是:userInfo,userInfo是一個字典,Object-C字典,key是NSObjectValues是AnyObject每一個廣播電台都會有一個userinfo,每個電台的userinfo會略有不同!

    例如:下圖為在iphone中設置本文文字大小後嬰改產生一個廣播通知!
    通知方式:透過UIContentSize類別的電台來發送改變的內容到共享通知中心讓所有人知道!
    在廣播時UserInfo中包含UIContentSizeCategoryNewValue(key),當從字典中取出此 key時便會得到本文文字的大小值。

    如何廣播:
    (1)創建 NSNotification後,透過defaultCenter中的postNotificationName進行廣播,範例如下:
     NSNotificationCenter.defaultCenter().postNotificationName("BLDownloadImageNotification", object: self, userInfo: ["imageView":coverImage, "coverUrl" : albumCover])

    注意事項:

    不要把這裡的通知和推送通知或者本地通知搞混了,這裡的通知是基於訂閱-發佈模型的,即一個對象 (發佈者) 向其他對象 (訂閱者) 發送消息。發佈者永遠不需要知道訂閱者的任何數據。

    Apple 對於通知的使用很頻繁,比如當鍵盤彈出或者收起的時候,系統會分別發送 UIKeyboardWillShowNotification/UIKeyboardWillHideNotification 的通知。當你的應用切到後台的時候,又會發送 UIApplicationDidEnterBackgroundNotification 的通知。

    注意:打開 UIApplication.swift 文件,在文件結尾你會看到二十多種系統發送的通知。


     補充說明:使用NSNotificationCenter發送通知,接收通知

    1,通知(NSNotification)介紹
    這裡所說的通知不是指發給用戶看的通知消息,而是系統內部進行消息傳遞的通知。要介紹通知之前,我們需要先瞭解什麼是觀察者模式。

    觀察者模式 (Observer):指一個對象在狀態變化的時候會通知另一個對象。參與者並不需要知道其他對象的具體是幹甚麼的 。這是一種降低耦合度的設計。常見的使用方法是觀察者註冊監聽,然後在狀態改變的時候,所有觀察者們都會收到通知。
    在 MVC 里,觀察者模式意味著需要允許 Model 對象和 View 對象進行交流,而不能有直接的關聯。

    Cocoa 使用兩種方式實現了觀察者模式: 一個是 Key-Value Observing (KVO),另一個便是本文要講的Notification。

    2,系統通知的註冊和回應
    比如我們想要在用戶按下設備的home鍵,程序進入後台時執行某些操作。一種辦法是在AppDelegate.swift里的applicationDidEnterBackground方法里執行。
    除此之外,由於程序進入後台會發送 UIApplicationDidEnterBackgroundNotification 的通知,我們可以事先註冊個監聽這個通知的「觀察者」來處理。

    notificationCenter.addObserverForName(UIApplicationDidEnterBackgroundNotification,
                    object: nil, queue: operationQueue, usingBlock: {
                    (notification: NSNotification!) in
                        print("開始")
            })

    //如果不需要的話,記得把相應的通知註冊給取消,避免內存浪費或奔潰
    //notificationCenter.removeObserver(applicationDidEnterBackgroundObserver)

     ------------------------------------以下回到Application Lifecycller介紹:
    以下為app啓動、來回切換app和螢幕鎖定時狀態的切換與對應的delegate對象的方法:

     (a)app啓動和active/inactive 
    說明:
    當app啓動時,首先由not running狀態切換到inactive狀態,此時調用application:didFinishLaunchingWithOptions:方法;然後由inactive狀態切換到active狀態,此時調用applicationDidBecomeActive:方法。
     當app發生中斷時,由active狀態切換到inactive狀態,此時調用applicationWillResignActive:方法。來回切換app

     如圖所示,當切換到另一個app時,由狀態active切換到inactive,此時調用applicationWillResignActive:方法;然後從inactive狀態切換到running狀態,此時調用applicationDidEnterBackground:方法。

    而當切換回本來的app時,由running狀態切換到inactive狀態,此時調用applicationWillEnterForeground:方法,然後由inactive狀態切換到active狀態,調用applicationDidBecomeActive:方法。
    如圖所示,當手機鎖屏時,由狀態active切換到inactive,此時調用applicationWillResignActive:;然後再由inactive狀態切換到running狀態,此時調用applicationDidEnterBackground:方法。
    螢幕鎖定

    如果app當時運行在後台並且沒有暫停,系統會在應用程序終止之前調用applicationWillTerminate:來保存用戶的一些重要數據以便下次啓動時恢復到app原來的狀態。

    ※在前台切換到後台後,停留在後台的時間非常短,因此如果有需要可以請求在透台停留常一點的時間。

    例如:networkActivityIndicatorVisible-是否打開網路UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    Info.plist:屬性列表,屬性列表是字典數組、字符串、日期的任何組合,包含許多App的設置內容,當 App設要設置如:PassBook、iCloud等時便需要透過plist進行。

    Core Motion
    Core Motion主要由加速器、陀螺儀與磁力計所組成
     (1)透過 class CMMotionManger來使用,每個app都會有一個CMMotionManger,這是一個globel resourse,因此不論在程式中何處皆可透過class method來取得。
    (2)有2種使用方式:
    (2.1)Polling方式:
       說明:
    創建Motion Manger來檢查加速器、陀螺儀與磁力計中哪個裝置可以使用,之後如果要使用都必須詢問一次哪個裝置可使用。
    缺點:較沒效率!

    (2.2) 以Closure閉包方式註冊Motion Manger:
    說明:透過註冊Motion Manger方式達到下列功能: 
    (2.2.1)var { accelerometer,gyro,magnetometer,deviceMotion}Available: Bool
    說明:詢問此裝置是否有效?True:有效、False:無效。

    (2.2.2)func start{Accelerometer,Gyro,Magnetometer,DeviceMotion}Updates()
     說明:開始使用這個裝置

    (2.2.3)var { accelerometer,gyro,magnetometer,deviceMotion}Active: Bool
    說明:此裝置是否使用中
     
    (2.2.4)func stop{Accelerometer,Gyro,Magnetometer,DeviceMotion}Updates()
     說明:停止使用此裝置





    留言

    熱門文章