make swift closures nsurlsession

make - swift 4 urlrequest



Valor de devolución inesperado no válido en la función de vacío(Swift 2.0) (2)

Arreglé el mío creando un controlador de finalización. Puede hacer esto en lugar de usar notificaciones:

class func fetchMinionData(completionHandler: (minions: [Minion]) -> Void) { var myURL = "http://myurl/test.json" let dataURL = NSURL(string: myURL) let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in let minionJSON = JSON(data!) var minions = [Minion]() for (_, minionDictionary) in minionJSON { minions.append(Minion(minionDetails: minionDictionary)) } completionHandler(minions: minions) //THIS IS WHERE YOUR PREVIOUS ERROR OCCURRED }).resume() }

He estado revisando las preguntas de StackOverflow tratando de descubrir dónde me equivoco con mi código, ¡pero parece que no puedo! Estoy tratando de convertir mi proyecto Swift 1.2 a Swift 2.0, y estoy teniendo un problema con mi clase que descarga datos JSON.

Continuamente recibo el error Valor de retorno inesperado no válido en la función de vacío .

Aquí está el código, algo truncado, que estoy usando;

... class func fetchMinionData() -> [Minion] { var myURL = "http://myurl/test.json" let dataURL = NSURL(string: myURL) let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in let minionJSON = JSON(data!) var minions = [Minion]() for (_, minionDictionary) in minionJSON { minions.append(Minion(minionDetails: minionDictionary)) } return minions //THIS IS WHERE THE ERROR OCCURS }).resume() } ...

Tal vez estoy pasando por alto algo simple, pero no estoy seguro de por qué mi función se consideraría nula en absoluto. ¡Cualquier idea sería inmensamente apreciada! ¡Gracias!


Tienes un problema porque tu línea:

return minions

no regresa de tu función En cambio, vuelve del controlador de finalización en dataTaskWithRequest . Y no debería hacerlo porque ese cierre es una función vacía.

El problema que tiene es resultado del hecho de que dataTaskWithRequest es una operación asincrónica. Lo que significa que puede regresar más tarde después de ejecutar su función.

Entonces, necesitas cambiar tu patrón de diseño.

Una forma de hacerlo sería la siguiente:

static var minions:[Minion] = [] { didSet { NSNotificationCenter.defaultCenter().postNotificationName("minionsFetched", object: nil) } } class func fetchMinionData() { var myURL = "http://myurl/test.json" let dataURL = NSURL(string: myURL) let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in let minionJSON = JSON(data!) var minions = [Minion]() for (_, minionDictionary) in minionJSON { minions.append(Minion(minionDetails: minionDictionary)) } self.minions = minions //THIS IS WHERE THE ERROR OCCURS }).resume() }

Luego, antes de llamar a su función, debe registrarse para escuchar NSNotification con el nombre "minionsFetched". Y solo después de recibir esa notificación debes procesar a los minions como si hubieran sido captados.