簡體   English   中英

Alamofire和並發操作隊列

[英]Alamofire and Concurrent Operation Queues

我在並發操作隊列中使用Alamofire (AF)在項目中運行網絡命令。 有時,AF的completionHandler不會觸發,而使我的NSOperation掛起(等待它永遠不會收到的完成消息)。

例如。 我將在下面看到“響應”日志,但在AF的dispatch_async中沒有相應的“請參閱”日志:

public func response(priority: Int = DISPATCH_QUEUE_PRIORITY_DEFAULT, queue: dispatch_queue_t? = nil, serializer: (NSURLRequest, NSHTTPURLResponse?, NSData?, NSError?) -> (AnyObject?, NSError?), completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self {
NSLog("markse-response")

    dispatch_async(self.delegate.queue, {
NSLog("markse-see me")
        dispatch_async(dispatch_get_global_queue(priority, 0), {
            if var error = self.delegate.error {
                dispatch_async(queue ?? dispatch_get_main_queue(), {
                    completionHandler(self.request, self.response, nil, error)
                })
            } else {
                let (responseObject: AnyObject?, serializationError: NSError?) = serializer(self.request, self.response, self.delegate.data, nil)

                dispatch_async(queue ?? dispatch_get_main_queue(), {
                    completionHandler(self.request, self.response, responseObject, serializationError)
                })
            }
        })
    })

    return self
}

這是我的NSOperation(AsynchronousCommand是NSOperation子類):

import Alamofire

class SettingsListCommand: AsynchronousCommand {

    override func execute() {
        if cancelled { return }

        let endpoint = "https://api.github.com/users/cog404/orgs"

        DLogVerbose("AF request")
        weak var weakSelf = self
        Alamofire.request(.GET,
            endpoint,
            parameters:nil)
            .responseJSON {(request, response, JSON, error) in
                DLogVerbose("AF response")
                if let strongSelf = weakSelf {
                    if strongSelf.cancelled {
                        strongSelf.finish()
                        return
                    }
                    DLogVerbose(JSON)
                    strongSelf.finish()
                }
        }
    }

}

這只會“偶爾”發生,因此很難調試。

是否有任何對線程有深入了解的人知道可能出了什么問題?

任何建議非常感謝。 一個項目來幫助說明的問題是在這里

請求委托的分派隊列是串行的,這意味着它僅一次按塊分派(FIFO)的順序處理一個塊。 如果第二個日志語句未觸發,那是因為前一個塊尚未完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM