Konvertiert nach Swift 3 Ich bemerkte einen seltsamen Fehler beim Lesen eines Headerfeldes von HTTPURLResponse.
%Vor%hat nicht mehr funktioniert.
Ich habe das "all headers dictionary" ausgedruckt und alle meine Header-Schlüssel scheinen im "sentence case" zu sein.
Laut Charles-Proxy sind alle meine Header in Kleinbuchstaben. Laut dem Backend-Team befinden sich die Header in ihrem Code in Titel-Case. Laut den Dokumenten: Header sollte Groß-und Kleinschreibung nicht beachten.
Also ich weiß nicht, was ich glauben soll. Findet jemand anderes in Swift 3 heraus, dass seine Header nun in Sentence case by iOS umgewandelt werden? Wenn ja, wollen wir dieses Verhalten?
Sollte ich einen Fehler bei Apple protokollieren oder sollte ich einfach eine Kategorie auf HTTPURLResponse machen, damit ich in der Lage bin, einen Header-Wert insensitiv zu finden.
Update : Dies ist ein bekanntes Problem .
allHeaderFields
sollte ein Wörterbuch ohne Beachtung der Groß- / Kleinschreibung zurückgeben, da dies die HTTP-Spezifikation erfordert. Sieht aus wie ein Swift-Fehler, ich würde einen Radar- oder einen Bug-Bericht einreichen.
Hier ist ein Beispielcode, der das Problem einfach reproduziert:
%Vor%(Angepasst von diesem Gist von Cédric Lüthi .)
Ich habe dies getroffen und habe mit einer Erweiterung von Dictionary
daran gearbeitet, benutzerdefinierte Indizes zu erstellen.
Die Zeitpunkte in den Kommentaren stammen vom Benchmarking verschiedener Szenarien (optimierter Build, -Os
, gemittelt über 1.000.000 Iterationen). Ein äquivalenter Zugriff eines Standardwörterbuchs kam bei 1257ns heraus. Zwei Checks effektiv zu verdoppeln, das hat 2412ns.
In meinem speziellen Fall sah ich, dass ein Header vom Server zurückkam, der in Camel-Case oder in Kleinbuchstaben geschrieben war, abhängig vom Netzwerk, mit dem ich mich verband (etwas anderes, das untersucht werden sollte). Der Vorteil davon ist, dass, wenn es behoben wird, ich einfach die Erweiterung löschen kann und nichts anderes ändern muss. Außerdem muss sich jeder, der den Code verwendet, keine Workarounds merken - sie erhalten diese kostenlos.
Ich habe überprüft, dass ETag
nicht von HTTPURLResponse
geändert wurde - wenn ich es weitergegeben habe ETag
oder Etag
Ich habe diese in allHeaderFields
zurückgeholt. Wenn die Leistung ein Problem darstellt und dieses Problem auftritt, können Sie einen zweiten Index erstellen, der ein Hashable
struct mit einem Array enthält. Übergeben Sie es dann an das Wörterbuch mit den Tags, die Sie behandeln möchten.
Dies ist, wie Sie erwarten würden, fast gleichbedeutend mit der Erstellung individueller Wörterbuch-Lookups.
Es gibt eine etwas kürzere Version als Darko's für swift 3.0.
Aufgrund der Tatsache, dass die Header-Namen Fälle in iOS8 und iOS10 unterschiedlich sein können, ist der beste Weg, einen case-insensitiven Vergleich zu verwenden.
%Vor%So werden jetzt alle Typen unterstützt:
Hier ist meins. Anstatt mit der Funktionsweise des Wörterbuchs herumzuspielen, habe ich eine Obj-c-Kategorie in NSHTTPURLResponse
erstellt. Das Obj-C allHeaderFields
Dictionary ist immer noch nicht Groß-und Kleinschreibung.
Tags und Links ios http swift3 case-insensitive nshttpurlresponse