2014-11-04 7 views

Antwort

31

Etwas Ähnliches könnte, was Sie suchen:

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

Verbrauch:

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

Wenn Sie alle Antworten ausdrucken möchten, Sie könnten Ihre eigene Antwortverfahren, ähnlich dem schreiben responseObject() Methode am Anfang der Übung:

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

[Update:. Unten pro Antrag von @trauzti hinzugefügt]

Hier ist, wie könnte man die responseObject() Ansatz, um auf jede Anfrage Ausgabe drucken tun.

Vorbehalt: Ich habe diesen Code nicht persönlich getestet und würde wahrscheinlich verschiedene Entscheidungen in der Produktion treffen. Dies zeigt einfach, wie der Wenderlich-Tutorial-Code Debug-Logging enthalten kann. Beachten Sie auch: Da das Tutorial vor-Swift 2.0 ist, habe ich das alte println() anstelle von print() verwendet.

@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, thanks! Können Sie den Code, den Sie für die ResponseObject-Erweiterung im Hinterkopf haben, veröffentlichen? – trauzti

+2

Btw der Code wird nicht mit Alamofire 3 funktionieren :) –

+0

Habe keine Zeit, um dies jetzt zu überprüfen, @MatthieuRiegler. Möchten Sie eine v3-kompatible Writup bereitstellen? :) – clozach

9

Timberjack ist, was Sie suchen. Timberjack ist ein einfacher, unaufdringlicher Netzwerkaktivitätslogger. Protokollieren Sie jede Anforderung, die von Ihrer App ausgeführt wird, oder beschränken Sie sie auf diejenigen, die eine bestimmte NSURLSession verwenden, falls Sie dies wünschen. Es funktioniert auch mit Alamofire, wenn das dein Ding ist.

https://cocoapods.org/pods/Timberjack

Nutzung:

import Alamofire 
import Timberjack 

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

Wie beschränken Sie es auf eine NSURLSession? – micap

0

oben Antwort Hinzufügen für Alamofire 4.0+ Swift 3

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

bei der Anforderung von

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

Wenn Sie den Antrag in jedem Fall abgebrochen werden soll (was etwas war, wollte ich) Sie können self.cancel() überall, bevor Sie selbst zurückkehren

13

Es gibt eine süße kleine Hülse für dieses: https://github.com/konkab/AlamofireNetworkActivityLogger

Fügen Sie dieses Ihrem podfile hinzu:

pod 'AlamofireNetworkActivityLogger', '~> 2.0' 

In Ihrem AppDelegate:

import AlamofireNetworkActivityLogger 

Dann in Ihrem didFinishLaunchingWithOptions, fügen Sie diese:

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

EDIT: Ich habe mit diesem tatsächlich begegnet Abstürze in der Produktion. Um auf der sicheren Seite, verwenden Sie "bauen Flags", um nur diese verwenden in debug, so etwas wie dieses:

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

Dies ist die beste Option, da der vorhandene Code nicht geändert werden muss. – manmal

+0

funktioniert nicht mit Karthago – PerrierCitror

-1

LÖSUNG FÜR SWIFT 3.0+

Für Druckanfrage Parameter und Header:

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() 

Für die Druckantwort. Verwenden Sie unten die Erweiterung.

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 
    } 
} 

Kleine Kern für Sie: https://gist.github.com/manishpathak99/348f2eb0167c0ff6e12ecd667612bc9b/edit