GCDシリーズ(二)dispatch_afterdispatch_appy;dispatch_オンス


オリジナルBlog、転載は出所を明記してください.
本文を読む過程で、概念が分からないなら、前のコラムの前の文章を参照してください.
これは私のGCDコラムの住所です.
http://blog.csdn.net/column/details/swift-gcd.html 本教がカバーする内容
一、dispatch_after二、dispatch_appy  三、dispatch_オンス
一、dispatch_アフターサービス
機能:しばらく遅延して一つのタスクをキューに提出して実行します.戻ったらキャンセルできません.
よく使われているのはホームチームの列で一つのタスクを遅延させることです.
関数プロトタイプ
func dispatch_after(_ when: dispatch_time_t,
                  _ queue: dispatch_queue_t!,
                  _ block: dispatch_block_t!)
パラメータ
        when	           
	queue	      
	block	     
例えば、dispatch_を利用することができます.afterは自分用のDelay関数を書きます.delayはしばらくメインスレッドでコードを実行します.
func hwcDelay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}
このように使うだけです.
hwcDelay(0.5){
//Do everrything you want
)
例えば、ユーザーのアプリケーションがいくつかのAppの必要条件を満たしていない場合(例えば、私たちのAppはBluetoothを開く必要があります)、そしてAPPが起動した時にBluetooth Offを測定したら、ユーザーにヒントを与えるべきです.viewのロードが完了したら、ユーザーにヒントを与えることができます.また、このヒントにアニメーションを追加することもできます.
例を引く
view Load後、1 s遅れて、alertviewを提示します.
class ViewController: UIViewController{    
    func hwcDelay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}  
    override func viewDidLoad(){    
        super.viewDidLoad()    
        hwcDelay(1.0){
		var alertview = UIAlertView(title:"Dispatch_after",message:"Message",delegate:self,cancelButtonTitle:"OK")
		alertview.show()
	}          
    }    
    override func didReceiveMemoryWarning(){    
        super.didReceiveMemoryWarning()    
    }    
} 
二、dispatch_appy
機能:一つのタスクをキューに提出して何度も実行します.具体的には並列実行ですか?それともシリアル実行ですか?アプリはすぐには戻りません.実行後に戻ります.同期の呼び出しです.
func dispatch_apply(_ iterations: UInt,
                  _ queue: dispatch_queue_t!,
                  _ block: ((UInt) -> Void)!)
パラメータ
iterations	     
	queue		      
	block		     
この関数はいつ使いますか?その機能から、関連しないループをバックグラウンドスレッドに提出して並列実行し、巡回タスクをバックグラウンドで実行する効率を向上させることができ、キュースケジュール自体のオーバーヘッドを削減することができ、効率が著しく向上することが分かります.
例を引く
たとえば、一連のオブジェクトが格納されている行列があります.初期化する時、これらのオブジェクトはいずれも関数を呼び出して関連計算を行います.これらの計算は相互に影響がない.この時、私達はdispatchを使うことができます.アプリケーションは非同期キューを使って初期化します.ここではこのような状況を簡略化します.
class ViewController: UIViewController{    
    var hwcarray = ["hello","hwc","hellohwc"]
    override func viewDidLoad(){    
        super.viewDidLoad()    
        dispatch_apply(3,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
		(index:UInt) -> () in
		var expObject = self.hwcarray[Int(index)] as NSString
		NSLog("%d",expObject.length)
	}  
	NSLog("Dispatch_after is over")     
    }    
    override func didReceiveMemoryWarning(){    
        super.didReceiveMemoryWarning()    
    }    
} 
が見られます.出力は?
3
5
8
dispatch_after is over
はこのようにしてメインスレッドをブロックし、次はdispatch_と共に.アプリの実行結果には関係がないので、非同期のキューからdispatch ch ch chを外すことができます.アプリを実行してお知らせします.
class ViewController: UIViewController{    
    var hwcarray = ["hello","hwc","hellohwc"]
    override func viewDidLoad(){ 
        super.viewDidLoad()
	dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
	 dispatch_apply(3,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
		(index:UInt) -> () in
		var expObject = self.hwcarray[Int(index)] as NSString
		NSLog("%d",expObject.length)
	 }
	 NSLog("Dispatch_after in global queue is over")  
	}    
       
	NSLog("Dispatch_after in main queue is over")     
    }    
    override func didReceiveMemoryWarning(){    
        super.didReceiveMemoryWarning()    
    }    
}
はこのように出力します.
8
Dispatch_after in main queue is over
3
5
Dispatch_after in global queue is over
は、マスタ列(メインスレッド)に対して非同期であり、globalキューで並列に実行されていることがわかる.
三、dispatch_オンス
機能:
APPの運行期間中、blockのコードは一回だけ実行することを保証します.
func dispatch_once(_predicate:Unisafe Mutble Pointer)
                 _ block:dispatch(blockit!)
パラメータ
predicate
提出したブロックが実行されたかどうかを判断するために使用します.
block
一回のタスクを実行します.
dispatch_ワンスの定番実用シーンは一例です.
単例コード:
class hwcSingleton {
     var testVariable:Int!
     func print(){
	testVariable = testVariable + 1
	println(testVariable)
	}
    class var sharedObject: hwcSingleton {
        struct StaticStruct {
            static var predicate : dispatch_once_t = 0
            static var instance : hwcSingleton? = nil
        }
        dispatch_once(&StaticStruct.predicate) {
            StaticStruct.instance = hwcSingleton()
	   StaticStruct.instance?.testVariable = 10
        }
        return StaticStruct.instance!
    }
}
もちろんマルチスレッド環境においても、コードの一部は一回だけ実行することができます.