我們用Swift實現了Splash頁面的顯示,但是僅僅顯示Splash頁面是不夠的,我們需要顯示Splash頁面2秒,然後跳轉到下一個頁面,因此需要實現定時任務的功能。在Android中,我們采用了系統的函數postDelayed來實現這一功能,在IOS系統中,我們需要使用GCD。
首先我們簡單了解一下GCD。我們知道,對於手機而言,多核CPU用得越來越多,這樣真正的多任務就是益成為現實,因為每個CPU核都可以獨立地執行單獨的任務。GCD正是為了使程序員更方便地使用多核CPU而引入的技術。GCD的英文全稱為Grand Central Dispath,是一個底層C API。GCD會根據多核CPU和硬件特性,創建最佳的線程池,應用程序員只需向GCD提交任務,並規定這些任務的屬性,如同步、異步、延時等,然後由GCD統一安排這些任務到合適的線程來執行。
在GCD中有一個dispath_after方法,可以實現延時執行一個任務的功能,我們可以使用該函數來實現Splash頁面顯示2秒,然後跳轉到其他頁面的功能。
為了實現Splash頁面的延時跳轉,我們需要首先定義一個Splash跳轉的目標頁面,這裡是我們定義的應用介紹頁面。
注意,實際上,當Splash頁面閃過時,會首先判斷應用是否是第一次運行,如果是第一次運行,則顯示應用介紹頁面,如果不是第一次運行且已經登錄,則直接進入應用主頁,如果不是第一次運行且沒有登錄,則進入登錄頁面,通常登錄頁面還有注冊鏈接,引導新用戶前往注冊。在這裡,我們暫時前不考慮這些業務邏輯,只是在Splash頁面閃過之後,直接進入應用介紹頁面。
首先,我們在WkyLib中定義應用介紹頁面基類WKYAppTourView.swift,這裡只有一個Label,只是為了有一個跳轉目標頁面而已
import UIKit public class WKYAppTourView { public init(rootView: UIView) { let testLabel = UILabel(frame: CGRectMake(0.0, 0.0, 120.0, 240.0)) testLabel.backgroundColor = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) testLabel.text = Hello! rootView.addSubview(testLabel) } }
再定義WKYAppTourViewController.swift
import UIKit public class WKYAppTourViewController: UIViewController { override public func viewDidLoad() { super.viewDidLoad() let rootView = self.view } override public func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } public var appTourView: WKYAppTourView? }
在WkgJys工程中定義WKYAppTourView的子類JYSAppTourView.swift
import UIKit import WkyLib class JYSAppTourView: WKYAppTourView { override init(rootView: UIView) { super.init(rootView: rootView) } }
定義WKYAppTourViewController的子類JYSAppTourViewController
import UIKit import WkyLib class JYSAppTourViewController: WKYAppTourViewController { override func viewDidLoad() { super.viewDidLoad() appTourView = JYSAppTourView(rootView: self.view) } }寫完上述代碼後,將AppDelegate.swift中的application方法中啟動的ViewController換成JYSAppTourViewController類(僅用於測試我們跳轉目標頁面能夠正常顯示,稍後我們還將改回Splash頁面),代碼如下所示:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. window = UIWindow(frame: UIScreen.mainScreen().bounds) //window?.rootViewController = JYSAppSplashViewController() window?.rootViewController = JYSAppTourViewController() window?.makeKeyAndVisible() return true }這時運行WkgJys工程,如果出現紅底黑字的Hello文字,就證明上述代碼沒有問題了,就可以接著向下進行了。
首先將AppDelegate.swift中啟動ViewController改回JYSAppSplashViewController。
然後修改JYSAppSplashViewController.viewDidAppear方法,加入使用GCD技術的延時任務代碼,如下所示:
override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) // delay task let delayInSeconds = 5.0 let delayInNanoSeconds = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) let currentQueue = dispatch_get_main_queue() dispatch_after(delayInNanoSeconds, currentQueue, { //self.changeRootViewController() println(Delay in (delayInSeconds) seconds) }) }
運行WkgJys工程,在工程啟動10秒之後,會在控制台上打出Delay in 10 seconds文字。這裡需要注意,由於我們要進行UI相關操作,因此需要使用主線程來執行,因此調用了dispatch_get_main_queue()方法。
好了,現在可以開始實現在延時任務裡啟動JYSAppTourViewController了。通常ViewController的切換是使用Storyboard的segue方式切換,另一種方式是用NavigationController來控制切換,由於我們不采用Storyboard,所以不能使用Storyboard相關方法,而使用NavigationController時,界面上部會有一個導航條,與我們的全屏顯示有矛盾,因此需要采用其他方式來實現。
首先,我們需要將延時任務的代碼從viewDidLoad方法移到viewDidAppeare方法中,代碼如下所示:
func changeRootViewController() { let appTourViewController = JYSAppTourViewController() self.dismissViewControllerAnimated(true, completion: nil) self.view.window?.rootViewController = appTourViewController self.view.window?.makeKeyAndVisible() }
這樣運行一下WkgJys工程,應可以看到Splash頁面顯示5秒後,就切換到紅底黑字的臨時界面了。
Splash頁面實現就基本完成了,下一節我們將回到Android系統,講述怎樣實現一屏一屏滑動顯示的應用介紹頁面,在這裡,我們還會談到怎樣識別是否是應用第一次運行,以及信息持久化存儲的方式。