2017-01-15 2 views
1

В настоящее время я предоставляю некоторым пользователям доступ к моему приложению через TestFlight, чтобы они могли его протестировать. На каждом iPhone приложение работает совершенно без проблем, но на iPhone 5 приложение падает каждый раз. В симуляторе xCode все работает правильно, но не на реальном устройстве.Alamofire вызывает крах на iPhone 5

Похоже, что Alamofire вызывает сбой. Проблема заключается в Alamofire> Источник> Функции> ResponseSerialization.swift> ответ (очереди: completionHandler :)

Вот код из функции:

/// Adds a handler to be called once the request has finished. 
/// 
/// - parameter queue:    The queue on which the completion handler is dispatched. 
/// - parameter completionHandler: The code to be executed once the request has finished. 
/// 
/// - returns: The request. 
@discardableResult 
public func response(queue: DispatchQueue? = nil, completionHandler: @escaping (DefaultDataResponse) -> Void) -> Self { 
    delegate.queue.addOperation { 
     (queue ?? DispatchQueue.main).async { 
      var dataResponse = DefaultDataResponse(
       request: self.request, 
       response: self.response, 
       data: self.delegate.data, 
       error: self.delegate.error 
      ) 

      dataResponse.add(self.delegate.metrics) 

      completionHandler(dataResponse) 
     } 
    } 

    return self 
} 

completionHandler(dataResponse) выглядит это проблема.

Ниже также скриншот из XCode

enter image description here

Это родственный Alamofire проблема? Потому что на каждом другом устройстве (5, 6, 7 Plus, SE и 7) он работает без проблем. Авария происходит, когда iPhone подключен к Wi-Fi и когда он использует мобильную сеть.

Спасибо за любые советы!

EDIT: Это должно быть раздел кода, который вызывается при запуске приложения:

Alamofire.request("https://app.site.tld/mobile/ios", parameters: parameters).response { response in 
     print("Request: \(response.request)") 
     print("Response: \(response.response)") 
     print("Error: \(response.data)") 

     if response.response != nil{ 
      if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
       print("Data: \(utf8Text)") 

       let weatherDataArr = utf8Text.components(separatedBy: "~") 
       guard let hash = String(weatherDataArr[0]) else { 
        completion(nil) 
        return 
       } 
       do { 
        //working with received data. 
        //let currData: wData = try wData(hash: hash, ....) 

        completion(currData) 
       } catch { 
        print("error creating Object: \(error)") 
        completion(nil) 
       } 

      } 
      else { 
       completion(nil) 
      } 
     }else { 
      completion(nil) 
     } 
    } 

Просто нашел предупреждение в Xcode, который говорит:

'catch' block is unreachable because no errors are thrown in 'do' block

+0

В чем версия iOS для iPhone 5? И какие версии iOS находятся на других устройствах? – mixel

+0

Есть ли сообщение об ошибке или код? – mixel

+0

Где вы вызываете функцию. Кажется, что он не имеет права. Это из статического экземпляра, который называется без ссылки? – Emptyless

ответ

0

Сначала упростить для удаления помех

Alamofire.request("https://app.site.tld/mobile/ios", parameters: parameters).response { response in 
    print("Request: \(response.request)") 
    print("Response: \(response.response)") 
    print("Error: \(response.data)") 

    var result: wData? = nil 
    defer { completion(result) } 

    guard response.response != nil else { return } 

    if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { 
     print("Data: \(utf8Text)") 

     let weatherDataArr = utf8Text.components(separatedBy: "~") 

     guard let hash = String(weatherDataArr[0]) else { return } 

     //working with received data. 
     //let currData: wData = try wData(hash: hash, ....) 

     result = currData 
    } 
} 

Тогда мы можем спросить себя

  1. Как вы на 100% уверены, что есть элементы в weatherDataArr? Если нет, используйте guard let hash = weatherDataArr.first else { return }
  2. Что происходит под //working with received data.?
+0

Ваш код вызывает следующую ошибку:' Невозможно вызвать значение нефункции type 'HTTPURLResponse?' ' 1.Да, я на 100% уверен, что есть данные, все это делается на стороне сервера. 2. Im просто разбивает массив и устанавливает некоторые значения, которые мне нужны. BTW: весь блок кода находится в функции: 'func getWeatherData (stnID: String, завершение: @escaping (wData?) -> Void) {' – Fabian

+0

Мой плохой. Я написал 'completeHandler' вместо' завершения'. 1. Хорошо (я думал, вы сказали, что вы запустили этот код на * телефонах *, а не на сервере?) 2. Упростите функцию при сохранении ошибки и опубликуйте ее http://stackoverflow.com/help/mcve – Andreas

+0

даже после смены он от 'completeHandler' до' завершения' только он все еще показывает мне ту же ошибку. 1) Да, верно, этот код работает по телефону, но выполняется только в том случае, если у пользователя есть активное интернет-соединение и ответ сервера определенно со значениями. – Fabian

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