2016-08-09 58 views
0

Ich habe einen trivialen Spielplatz und einen einfachen TCP-Server auf localhost. Ich möchte nur eine URLSessionStreamTask abbrechen, die bereits eine readData-Operation in der Warteschlange hat. Was ist verrückt ist, dass dieser genaue Spielplatz völlig in Ordnung für iOS oder TVOS funktioniert, aber nicht für MacOS.Abbrechen URLSessionStreamTask ruft niemals die CompletionHandler mit NSURLErrorCancelled (auf MacOS)

auf iOS/tvOS bekomme ich folgende Ausgabe: "Victory"

Resuming... 
Cancelling... 
After cancel call 
Victory! The session task was properly cancelled! 

Auf macOS (10.11), um die Nachricht wird nie gedruckt. Hier

ist der Spielplatz:

import Foundation 
import PlaygroundSupport 

let task = URLSession.shared.streamTask(withHostName: "localhost", port: 12345) 

task.readData(ofMinLength: 1, maxLength: 1024, timeout: 0) { (data, atEOF, error) in 
    if let error = error as? NSError { 
     if error.code == NSURLErrorCancelled { 
      print("Victory! The session task was properly cancelled!") 
     } 
    } 
} 

print("Resuming...") 
task.resume() 

print("Cancelling...") 
task.cancel() 
print("After cancel call") 
PlaygroundPage.current.needsIndefiniteExecution = true 

Bin ich hier etwas fehlt? Ich verwende XCode 8 (Beta 4). Jede Hilfe wird sehr geschätzt. Vielen Dank.

+0

Dies könnte ein CPU-Geschwindigkeitsproblem sein. Insbesondere hat die Sitzung möglicherweise bereits alle Daten aus dem Stream gelesen und diese lokal gespeichert. Sie warten darauf, dass Ihre App sie anfordert, bevor Ihre App sogar Zeit hat, die Verbindung abzubrechen. Tritt dieses Problem auch auf, wenn Ihr Server ... ein Gigabyte Daten sendet? – dgatwood

Antwort

0

Ich bin sicher, das ist alt, aber unter 10,12 scheint das richtig zu funktionieren.

Resuming... 
Cancelling... 
After cancel call 
Victory! The session task was properly cancelled!