加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 06:59:37 所属栏目:百科 来源:网络整理
导读:刚开始学习swift语言,学习了网上的多线程构造方式写了一个小demo,源代码如下所示 import UIKit /* 图片总数 */ let totalImg_COUNT : NSInteger = 20 /* 下载图片地址 */ let downloadImg_URL = "http://img10.360buyimg.com/imgzone/jfs/t2767/272/624097

刚开始学习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)

self.downloadcountlab.frame=CGRectMake(150,400,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!)

})

}

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读