2016-08-04 20 views
0

Der folgende Code aus dem Quellcode der AlamofireWarum Alamofire verwendet die Funktion dispatch_sync() beim Erstellen einer DataTask?

let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL) 

public func request(URLRequest: URLRequestConvertible) -> Request { 
    var dataTask: NSURLSessionDataTask! 
    dispatch_sync(queue) { dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) } 

    let request = Request(session: session, task: dataTask) 
    self.delegate[request.delegate.task] = request.delegate 

    if startRequestsImmediately { 
     request.resume() 
    } 

    return request 
} 

Es scheint, wie es jedes Mal eine dataTask schafft, versenden es, diesen Prozess zu einem seriellen Warteschlange zu schaffen. Würde diese Maßnahme das Programm vor jeglicher Art von Multi-Thread-Traps schützen?

Ich kann nicht herausfinden, was der Unterschied ohne diese Warteschlange ist.

Antwort

1

Der Grund, warum wir diese Überprüfung implementiert haben, ist auf Alamofire Issue #393 zurückzuführen. Wir haben doppelte Task-IDs ohne die serielle Warteschlange beim Erstellen von Daten und beim parallelen Hochladen von Tasks aus mehreren Threads erhalten. Es scheint, dass Apple ein Thread-Sicherheitsproblem hat, wenn die Task-IDs erhöht werden. Daher beseitigen wir in Alamofire das Problem, indem wir die Aufgaben in einer seriellen Warteschlange erstellen.

Prost.