swift 互斥锁lock学习

前端之家收集整理的这篇文章主要介绍了swift 互斥锁lock学习前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一些学习过程中的难点解决

lock锁看了一片文章,写的很牛车:http://www.jb51.cc/article/p-dlsctegq-zv.html

例子

lock锁,我是用于两个线程同时执行一段代码或者一个方法,比如同时刷新auth认证,例如:

  1. class ViewController: UIViewController {
  2. let lock = NSLock()
  3. var person = Person(name: "Leo",age: 23)
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. let queue1 = dispatch_queue_create("com.test.queue1",DISPATCH_QUEUE_SERIAL)
  7. let queue2 = dispatch_queue_create("com.test.queue1",DISPATCH_QUEUE_SERIAL)
  8. dispatch_async(queue1) { () -> Void in
  9. self.lock.lock()
  10. self.person.update("queue1",delay: 2,age: 1)
  11. self.lock.unlock()
  12. }
  13. dispatch_async(queue2) { () -> Void in
  14. self.lock.lock()
  15. self.person.update("queue2",delay: 1,age: 2)
  16. self.lock.unlock()
  17. }
  18. self.performSelector("logPerson",withObject: nil,afterDelay: 4)
  19. // Do any additional setup after loading the view,typically from a nib.
  20. }
  21. func logPerson(){
  22. NSLog("%@ %d",person.name,person.age)
  23. }
  24.  
  25. }

这样就会当执行 self.person.update(“queue2”,delay: 1,age: 2)时候锁定,执行完后释放锁,然后下一个线程才会重新调用update,这样数据不会错乱

我的代码是这样的:

  1. case .Failure(let error):
  2. if response.response?.statusCode == 401{//刷新token
  3. dispatch_async(queue3) { () -> Void in
  4. lock?.lock()//这里添加互斥锁,防止一起刷新token,这样就会分开之行token方法cjq
  5. RefreshToken({ (AnyObject) in
  6. lock?.unlock()
  7. var hs = headers
  8. hs!["Authorization"] = NSUserDefaults.standardUserDefaults().stringForKey("access_token")
  9. }
  10. },logout: { (NSError) in
  11. logout?()
  12. lock?.unlock()
  13. })
  14. }
  15. }else{
  16. failure?(error)
  17. }
  18. }

RefreshToken(success:((AnyObject?) -> Void)?,logout:((NSError?) -> Void))是闭包函数

猜你在找的Swift相关文章