相关代码:
dispatch_async(dispatch_get_main_queue(), { () -> Void in self.insertLock.lock() 。。。 msgTVC.messageList.insert(newMessage, atIndex: curIdx) msgTVC.messageList.append(newMessage) 。。。 self.insertLock.unlock() }) |
出错:
2016-02-18 18:58:11.733 JianDao[16207:1088768] *** -[NSLock lock]: deadlock (<NSLock: 0x7a06bc90> ‘(null)’) 2016-02-18 18:58:11.734 JianDao[16207:1088768] *** Break on _NSLockError() to debug. |
点击 暂停 的那个按钮,然后去调试
搜:
swift NSLock lock deadlock NSLock 0x7a06bc90
swift NSLock lock deadlock NSLock
iphone – How can I set a breakpoint on _NSLockError() – Stack Overflow
(lldb) b _NSLockError Breakpoint 133: where = Foundation`_NSLockError, address = 0x01a42245 |
搜:
dispatch_get_main_queue deadlock NSLock
Swift线程安全详解-概念,三种锁,死锁,Atomic,synchronized – Wenchen的专栏 – 博客频道 – CSDN.NET
说了:
NSArray
是线程安全的
-》那么此处就不需要再加锁了?
那去试试:
。。。 msgTVC.messageList.insert(newMessage, atIndex: curIdx) 。。。 msgTVC.messageList.append(newMessage) 。。。 self.insertLock.lock() 。。。 messageTableView.insertRowsAtIndexPaths([insertedRowIndexPath], withRowAnimation: UITableViewRowAnimation.Bottom) 。。。 msgTVC.messageTableView.scrollToRowAtIndexPath(insertedRowIndexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: false) 。。。 self.insertLock.unlock() |
需要待以后,看看是否还会出现此lock出错的问题,才知道是否解决了问题。
后来经过很长时间,至少没有出现类似的死锁了。
算是解决了lock死锁的问题了。