【Swift】三种多线程处理方式

刚开始学习swift语言,学习了网上的多线程构造方式写了一个小demo,源代码如下所示


import UIKit


/*图片总数

 */

let totalImg_COUNT : NSInteger = 20

/*下载图片地址

 */

let downloadImg_URL = "http://img10.360buyimg.com/imgzone/jfs/t2767/272/624097155/382343/b9a734bc/571da504N0e996b41.jpg"


let downloadImg_URL2 = "http://img10.360buyimg.com/imgzone/jfs/t2863/130/1039983507/438543/213230d3/5732c8daN2194ab7d.jpg"


var MainVC : ViewController = ViewController()


/*结构体  暂时不用

 */

//struct SomeStructure {

//    

//    static var MainVC : ViewController = ViewController()

//}


class ViewController: UIViewController

{

    var activityIndicator : UIActivityIndicatorView = UIActivityIndicatorView()

    

    var downloadcountlab : UILabel = UILabel()

    

    var imgview : UIImageView = UIImageView()

    

    var imgcount : NSInteger = 0


    override func viewDidLoad() {

      

        super.viewDidLoad()


        MainVC = self

        

        self.initview()

        

        let btnnamearr = ["Thread","Operation","GCD","Clear"]


        let methodarr = [#selector(testNSThread),#selector(testOperationQueue),#selector(testGCD(_:)),#selector(clear)]

        

        for name in btnnamearr {

            

            let Threadbtn:UIButton = UIButton(type:.System)

            

            let index: Int? = btnnamearr.indexOf(name)

            

            let floatvalue : CGFloat = CGFloat(index!)


            Threadbtn.frame=CGRectMake(10, floatvalue * 50 + 100, 100, 35)

 

            Threadbtn.setTitle(name, forState:UIControlState.Normal) //普通状态下的文字

            

            Threadbtn.setTitle("触摸", forState:UIControlState.Highlighted) //触摸状态下的文字

            

            let method : Selector = methodarr[index!]

            

            Threadbtn.addTarget(self,action:method,forControlEvents:.TouchUpInside)

            

            self.view.addSubview(Threadbtn);

        }

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

    

    //1.NSThread 线程

    

    func testNSThread(){

        

        self.clear()

        

        self.showisloading()

        

        for _ in 0  ..< totalImg_COUNT{

        /*

         手动创建线程

         */

            let  thread1 = NSThread(target: self, selector: #selector(LoadImage), object: nil)

            

            thread1.name="loading img"

            

            thread1.start()

            

        /*

         类方法创建线程

         */

//            NSThread.detachNewThreadSelector(#selector(dlBigImage), toTarget: self, withObject: nil)


        }

        

        NSLog("thread success")

        

    }

    

    /*

     加载图片

     */

    

    func LoadImage(){

        

        /*

         时间较长操作

         */

        

        var urlstring:String=String()

        

        if MainVC.imgcount < 2 {

            

            urlstring = downloadImg_URL2

        }

            

        else

        {

            urlstring = downloadImg_URL

        }

        

        let data = NSData (contentsOfURL: NSURL (string:urlstring)!)

        

        let img = UIImage (data: data!)

        

        if img != nil{


        NSLog("currentThread %@", NSThread.currentThread())


        dispatch_async(dispatch_get_main_queue(), { () -> Void in

            

            self.loadingsuccess(img!)

            

           })


        }

        

    }

    

    // 2.NSOperation 队列

    

    func testOperationQueue(){


        self.clear()

        

        self.showisloading()

        

        let queue = NSOperationQueue()


        queue.maxConcurrentOperationCount = 5 ;

        

        var operations = [MyOperation]()

        

        for _ in 0  ..< totalImg_COUNT  {

            

            let myOperation = MyOperation()

            

            myOperation.delegate = self

            

            operations.append(myOperation)

            

        }

        

        queue.addOperations(operations,waitUntilFinished: false)

        

    }

    

    //​​3.GCD  Grand Central Dispatch


    func testGCD(button:UIButton){

        

        NSLog("button tag is %d",button.tag)


        self.clear()

        

        self.showisloading()

        

        for _ in 0  ..< totalImg_COUNT  {

            

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in

                

                /*

                 时间较长操作

                 */

                var urlstring:String=String()


                if MainVC.imgcount < 2 {

                

                    urlstring = downloadImg_URL2

                }


                else

                {

                    urlstring = downloadImg_URL

                }

                

                let data = NSData (contentsOfURL: NSURL (string:urlstring)!)

                

                let img = UIImage (data: data!)

                

                if img != nil{

                    

                    dispatch_async(dispatch_get_main_queue(), { () -> Void in

                        

                        self.loadingsuccess(img!)

                        

                    })

                    

                }

                

            })


        }

        

    }

    

    /*

     初始化视图

     */

    

    func initview()

    {

        

        self.imgview.frame=CGRectMake(150, 150, 100, 100)

        

        self.downloadcountlab.frame=CGRectMake(150, 400, 100, 100)

        

        self.view.addSubview(self.downloadcountlab)

        

        self.activityIndicator = UIActivityIndicatorView(activityIndicatorStyle:

            UIActivityIndicatorViewStyle.Gray)

        

        self.activityIndicator.center = CGPointMake(50, 70)

    }

    

    /*

     清理图片与状态栏

     */

    

    func clear(){

        

        self.downloadcountlab.text = ""

        

        for view in self.view.subviews {

        

            if view .isKindOfClass(UIImageView) {

            

                view.removeFromSuperview()

                

            }

            

        }

        

        self.imgcount = 0

        

    }

    

    /*

     正在加载

     */

    

    func showisloading(){

        

        self.activityIndicator.removeFromSuperview()

        

        self.view.addSubview(self.activityIndicator)

        

        self.activityIndicator.startAnimating()


    }

    

    /*

     加载成功

     */

    

    func loadingsuccess(img:UIImage){

        

        self.imgcount=self.imgcount + 1

        

        self.downloadcountlab.text=String(self.imgcount)


        let y :CGFloat = CGFloat(self.imgcount/3*50)

        

        let imgview : UIImageView = UIImageView()

        

        imgview.frame = CGRectMake(150 + CGFloat(self.imgcount%3) * 50.0,50 + y, 40, 40)

        

        imgview.image = img

        

        self.view.addSubview(imgview)

        

        NSLog("self.imgcount is %d", self.imgcount)

        

        if self.imgcount == totalImg_COUNT {

            

            self.activityIndicator.stopAnimating()


            self.activityIndicator.removeFromSuperview()


        }

    

    }

    

}


/*

 我的队列类

 */


class MyOperation: NSOperation {


    weak var delegate:ViewController?

    

    override func start() {

 

        super.start()

        

    }

    

    override func main(){

       

        /*

         时间较长操作

         */

        var urlstring:String=String()

        

        if MainVC.imgcount < 2 {

            

            urlstring = downloadImg_URL2

        }

        else

        {

            urlstring = downloadImg_URL

        }

        

        let data = NSData (contentsOfURL: NSURL (string:urlstring)!)

        

        let img = UIImage (data: data!)

                

        if img != nil{

            

            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                

                MainVC.loadingsuccess(img!)

                

            })

    

        }

    }

    

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值