2014-11-04 1 views

ответ

31

Нечто подобное могло бы быть то, что вы искали:

extension Request { 
    public func debugLog() -> Self { 
     #if DEBUG 
     debugPrint(self) 
     #endif 
     return self 
    } 
} 

Использование:

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) 
     .debugLog() 
     .response {…} 

Если вы хотите напечатать все ответы, вы можете написать свой собственный метод ответа, похожий на метод responseObject() в верхней части этого учебника:

http://www.raywenderlich.com/87595/intermediate-alamofire-tutorial

[Обновление:. Добавлено ниже по запросу от @trauzti]

Вот как можно было бы сделать подход responseObject() для того, чтобы напечатать выход на каждый запрос.

Caveat lector: Я лично не тестировал этот код и, вероятно, делал бы разные варианты в производстве. Это просто показывает, как код учебника Wenderlich может включать протоколирование отладки. Также обратите внимание: начиная с учебника до Swift 2.0, я использовал старый println() вместо print().

@objc public protocol ResponseObjectSerializable { 
    init(response: NSHTTPURLResponse, representation: AnyObject) 
} 

extension Alamofire.Request { 
    public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self { 
    let serializer: Serializer = { (request, response, data) in 

     #if DEBUG 
     println("Request: \(request.URL)") 
     #endif 

     let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments) 
     let (JSON: AnyObject?, serializationError) = JSONSerializer(request, response, data) 
     if response != nil && JSON != nil { 
     #if DEBUG 
      println("Response:") 
      debugPrint(JSON) 
     #endif 

     return (T(response: response!, representation: JSON!), nil) 
     } else { 
     #if DEBUG 
      println("Failed Serialization:") 
      debugPrint(serializationError) 
     #endif 

     return (nil, serializationError) 
     } 
    } 

    return response(serializer: serializer, completionHandler: { (request, response, object, error) in 
     completionHandler(request, response, object as? T, error) 
    }) 
    } 
} 
+1

Awesome, спасибо! Не могли бы вы опубликовать код, который вы имеете в виду для расширения responseObject? – trauzti

+2

Btw код не будет работать с Alamofire 3 :) –

+0

Не успел пересмотреть это прямо сейчас, @MatthieuRiegler. Позаботьтесь о совместимости с v3? :) – clozach

9

Timberjack - это то, что вы ищете. Timberjack - простой, неинтрузивный регистратор сетевой активности. Регистрируйте каждый запрос, который делает приложение, или ограничивайте его только теми, кто использует определенный NSURLSession, если вы предпочитаете. Он также работает с Alamofire, если это ваша вещь.

https://cocoapods.org/pods/Timberjack

использование:

import Alamofire 
import Timberjack 

class HTTPManager: Alamofire.Manager { 
static let sharedManager: HTTPManager = { 
    let configuration = Timberjack.defaultSessionConfiguration() 
    let manager = HTTPManager(configuration: configuration) 
    return manager 
}() 
} 
+0

Как вы ограничиваете его NSURLSession? – micap

0

Добавление к выше ответа для Alamofire 4.0+ Swift 3

extension DataRequest {   
     public func LogRequest() -> Self { 
     //Your logic for logging 
     return self 
    } 
} 

Когда запрашивающая

Alamofire.request(requestUrl, method: .post, parameters: parameter, encoding: JSONEncoding.default) 
      .LogRequest() 
      .responseJSON { response in 
      //Do your thing 
      } 

Если вы хотите отменить запрос в любом случае (что-то я хотел), вы можете self.cancel() где-нибудь, прежде чем вернуться самостоятельно

13

Там в сладкая маленькая порция для этого: https://github.com/konkab/AlamofireNetworkActivityLogger

Добавить это в ваш подкайл:

pod 'AlamofireNetworkActivityLogger', '~> 2.0' 

В вашем AppDelegate:

import AlamofireNetworkActivityLogger 

Затем в didFinishLaunchingWithOptions, добавьте это:

NetworkActivityLogger.shared.level = .debug 
NetworkActivityLogger.shared.startLogging() 

EDIT: Я на самом деле, с которыми сталкиваются аварии с этим в производстве. Для того, чтобы быть на безопасной стороне, используйте «флаги сборки» только использовать это в отладке, что-то вроде этого:

#if DEBUG 
    NetworkActivityLogger.shared.level = .debug 
    NetworkActivityLogger.shared.startLogging() 
#endif 
+1

Это лучший вариант, поскольку он не требует каких-либо изменений в существующем коде. – manmal

+0

не работает с Карфагене – PerrierCitror

-1

РЕШЕНИЕ ДЛЯ СВИФТ 3.0+

Для параметра запроса печати и заголовки:

Alamofire.request(url, method: .get, parameters: parameters, headers: headers) 
      .validate() 
      .responseObject { (response: DataResponse<T>) in 
       self.pendingRequests.removeValue(forKey: endPoint) 
       completion!(response) 

       if(NetworkConfig.loggingEnable) { 
        debugPrint("************* printing REQUEST parameter and Headers *************") 
        debugPrint("RESPONSE : \(response.debugDescription)") 
       } 
     }.responseDebugPrint() 

Для ответа на печать. используйте ниже расширения.

import Foundation 
import Alamofire 

extension Alamofire.DataRequest { 
    func responseDebugPrint() -> Self { 
     if NetworkConfig.loggingEnable { 

      return responseJSON() { 
       response in 
       if let JSON = response.result.value, 
        let JSONData = try? JSONSerialization.data(withJSONObject: JSON, options: .prettyPrinted), 
        let prettyString = NSString(data: JSONData, encoding: String.Encoding.utf8.rawValue) { 
        print(prettyString) 
       } else if let error = response.result.error { 
        print("Error Debug Print: \(error.localizedDescription)") 
       } 
      } 
     } 
     return self 
    } 
} 

Малой суть для вас: https://gist.github.com/manishpathak99/348f2eb0167c0ff6e12ecd667612bc9b/edit