您的位置:首页 > 移动开发 > Swift

swift_多线程基础_最简单用法(GCD, NSOperationQueue, NSThread)

2016-01-14 17:10 585 查看
//

//  ViewController.swift

//  study1-1

//

//  Created by admin on 15/12/28.

//  Copyright © 2015年 admin. All rights reserved.

//

import UIKit

class ViewController:
UIViewController {

    

    @IBOutlet var myLable:UILabel?

    @IBAction func clickButton(){

    

   
// IOS中多线程有以下三种实现方法

    // 1. GCD

        //
子线程中请求网络

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0),{

            

            // 开始网络请求

            self.sendData()

            

            //
在主线程中更新UI

            dispatch_async(dispatch_get_main_queue(), {

            

            self.updateLable()

                

            })

        })

        

   
// 2. NSOperationQueue:
系统提供的类,直接在这个累方法中将需要多线程执行的代码放入即可,但是同时要将UI更新放入主线程,则只能把UI更新的代码通过GCD方式添加到主线程中

        let myOperation =
NSBlockOperation(block: {

            

            self.sendData1()  
// 这里要注意在sendData1()中将UI更新使用GCD添加到主线程

        })

        NSOperationQueue().addOperation(myOperation)

        

    // 3. NSThread

        NSThread.detachNewThreadSelector("sendData1", toTarget:
self, withObject:
nil)

    }

    

    //
发送数据,

   
// 一般放在子线程中,如果放在主线程中会阻塞UI的更新,造成假死现象

    func sendData(){

    

        sleep(5)

    }

    //
更新UI

   
// 一般放在主线程中

    func updateLable(){

        

        myLable?.text =
"数据发送成功"

    }

    func sendData1(){

        

        sleep(5)

        

        //
在主线程中更新UI

        dispatch_async(dispatch_get_main_queue(), {

            

            self.updateLable()

            

        })

    }

    

    

    

    override func viewDidLoad()

    {

        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning()

    {

        super.didReceiveMemoryWarning()

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios swift 多线程 gcd