我們用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系統,講述怎樣實現一屏一屏滑動顯示的應用介紹頁面,在這裡,我們還會談到怎樣識別是否是應用第一次運行,以及信息持久化存儲的方式。