当通过Xcode运行我的OSX应用程序时,我的线程工作得非常好,但是,当我归档应用程序时,Export as a Mac Application
应用程序非常明显地在主线程上完全阻塞并发线程正在工作的位置。
有什么想法吗?
我的一些代码附在下面。 processData()
函数至少可以说是非常重要的,因此它不会让整个应用程序在运行时戛然而止。正如我所说的,它在从Xcode运行时效果很好,但在导出时似乎不想玩球。这很奇怪。
func reloadTableView() {
self.noDataLabel.hidden = true;
self.loadingIndicator.hidden = false;
self.loadingIndicator.startAnimation(self)
let queue = dispatch_queue_create("data-processing-queue", DISPATCH_QUEUE_CONCURRENT)
NetworkHandler.getLiveMatches(queue, completionHandler: {(request, response, data, error) in
if response!.statusCode == 200 {
self.processData()
}
dispatch_async(dispatch_get_main_queue()) {
self.loadingIndicator.hidden = true;
self.loadingIndicator.stopAnimation(self)
self.noDataLabel.hidden = self.dataSource.count > 0
self.tableview.reloadData()
}
})
}
Xcode 7.3.1,OSX 10.11.3
编辑: getLiveMatches代码
class func getLiveMatches(queue: dispatch_queue_t, completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Void) {
let parameters = ["ApiKey" : ApiKey]
Alamofire.request(.GET, BaseURL+"/ApiEndpoint", parameters: parameters).response(queue:queue, completionHandler: { (request, response, data, error) -> Void in
let xml = SWXMLHash.parse(data!)
//print(xml)
var matches = [Match]()
if response?.statusCode == 200 {
// Parse XML into mtch
matches.append(mtch)
}
if matches.count > 0 {
dataStoreSingleton.matchesArray = matches
}
completionHandler(request, response, data, error)
})
}
编辑2:队列debugDescriptions, 并发队列:
<OS_dispatch_queue: data-processing-queue[0x7fd0da574600] = { xrefcnt = 0x2, refcnt = 0x1, suspend_cnt = 0x0, locked = 0, target = com.apple.root.default-qos[0x7fff78eba100], width = 0x7fff, running = 0x0, barrier = 0 }>
主要队列:
<OS_dispatch_queue: com.apple.main-thread[0x7fff78eb9a40] = { xrefcnt = 0x80000000, refcnt = 0x80000000, suspend_cnt = 0x0, locked = 1, target = com.apple.root.default-qos.overcommit[0x7fff78eba180], width = 0x0, running = 0x0, barrier = 1 , thread = 0x50f }>
编辑3:如果我连续多次执行reloadTableView()
,我可以在Xcode项目中重新创建此问题。否则它工作正常。
答案 0 :(得分:0)
这里的错误是使用dispatch_async(dispatch_get_main_queue()) {
。
我不认为GCD喜欢这个,经过一些研究,看起来实际上不好的做法是将主队列异步化。而应使用dispatch_sync(dispatch_get_main_queue()) {
。至于奇怪的行为,我认为当主线程为空并且主队列的异步然后放在主线程上时它起作用 - 因此一切都按预期工作 - 但是当主线程忙时GCD并不欣赏异步主队列并将所有队列压缩到主线程上。