2016-02-22 2 views
1

Я столкнулся с тупиком внутри одной из операций в очереди делегатов NSUrlSession при использовании Alamofire.Тупик внутри очереди делегатов NSURLSession

Это происходит, когда я выполняю хотя бы одну загрузку и одну загрузку одновременно (все запросы выполняются через менеджер Alamofire по умолчанию). Есть ли проблема в том, что это связано с несколькими потоками? (либо в NSUrlSession, либо в Alamofire)

похоже, что он застрял на __psynch_mutexwait в одной из операций в очереди делегатов NSURLSession и полностью отключает возможность приложения делать сетевые запросы через Alamofire (потому что делегат не будет быть вызванным когда-либо).

, как я сказал, что загрузка и загрузка называется одновременно на 2-х разных очередей (один из них, как правило, называют в основном потоке) пример

загрузки:

 Alamofire.upload(.POST, uploadURL, 
     multipartFormData: { multipartFormData in 
       multipartFormData.appendBodyPart(data: x.dataUsingEncoding(NSUTF8StringEncoding)!, name: "X") 
       multipartFormData.appendBodyPart(data: fileData, name: "file", fileName: "Y", mimeType: "application/octet-stream") 
      } 
     }, 
     encodingCompletion: { encodingResult in 
      switch encodingResult { 
      case .Success(let upload, _, _): 
       upload.response { (request, response, data, error) -> Void in 
        if let error = error { 
         callback("Failure", "\(error)") 
        } else { 
         callback("SUCCESS", nil) 
        } 
       } 
      case .Failure(let encodingError): 
       callback(nil, "Failed due to \(encodingError)") 
      } 
     } 
    ) 

скачать пример:

Alamofire.download(.GET, downloadUrl, parameters: ["a": "a", "b": "b"], destination: 
     { 
      tempURL, response in 
      return path 
    }).response { 
     (request, response, _, error) in 
     let data = NSData(contentsOfURL: path) 
     doSomeStuffWithDownloadedData(data) 
     // make another request after download completed 
     Alamofire.request(.GET, requestUrl, parameters: ["c":"c", "d":"d"]).response { 
      request, response, data, error in 
      if let e = error { 
       log.error("request failed, \(e)") 
      } 
     } 
    } 

stack trace

+1

У вас есть пример кода и/или некоторые выходы или журналы, на которые мы могли бы обратить внимание? –

+0

добавлены примеры кода и трассировка стека – yeps

ответ

1

После комментариев g в большинстве моих кодов я изолировал код, вызывающий проблему, и он вообще не связан с alamofire или NSURLSession.

У меня в моем собственном коде есть вызов objc_sync_enter на массив (объектов), он всегда имеет соответствующий вызов objc_sync_exit в том же массиве. после изменения этого вызова на self вместо этого массива, тупик внутри NSBlockOperation исчез. Это может быть связано с тем, что массив не является объектом, а структурой. Поэтому, если вы испытываете очень странный тупик в своем коде, я предлагаю, чтобы перед тем, как попробовать что-нибудь еще, убедитесь, что у вас нет вызовов objc_sync_enter на structs.

+0

Не могли бы вы вывести код о тупике по массиву. У меня такая же проблема, используя AFNetworking. –

Смежные вопросы