【问题标题】:How do I get the data from an NSURLSession as a string?如何从 NSURLSession 获取数据作为字符串?
【发布时间】:2015-07-19 14:47:49
【问题描述】:

我使用的 API 以简洁的格式为我提供数据 - 我如何将其作为 String 获得?我可以打印它,但将其保存为字符串似乎不起作用。

我特别想使用来自 NSURLSession 任务的数据更新 UI 元素。

    let url = NSURL(string: apiCall)
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
        //I want to replace this line below with something to save it to a string.
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

    task.resume()

【问题讨论】:

  • 如果你做的很明显(将它分配给一个字符串变量),你会遇到什么问题?
  • 当我从任务内部打印字符串时,它有正确的数据,但在任务之后它是空的。

标签: ios swift nsurl nsurlsession


【解决方案1】:

斯威夫特 4

let data = String(bytes: data, encoding: String.Encoding.utf8)

【讨论】:

    【解决方案2】:

    如果你的问题是它在任务之外是空的,那是因为它在完成块结束后超出了范围。您需要将其保存在范围更广的地方。

    let url = NSURL(string: apiCall)
    var dataString:String = ""
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
        //I want to replace this line below with something to save it to a string.
        dataString = String(NSString(data: data, encoding: NSUTF8StringEncoding))
        dispatch_async(dispatch_get_main_queue()) {
            // Update the UI on the main thread.
            self.textView.text = dataString
        });
    
    }
    task.resume()
    

    现在当您访问 dataString 时,它将被设置为来自任务的数据。不过要小心,在任务完成之前,不会设置 dataString,所以你应该真正尝试在完成块中使用它。

    【讨论】:

    • 所以我尝试的时候就是这样分配的,直到任务完成我才意识到它不起作用。这解决了一个问题,但是现在当我尝试直接分配它时,它给了我一些奇怪的 NSException。我添加了 self.textView.text = dataString 。我觉得这样做可能有明显的问题?
    • 在任务块中:let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in var dataString:String = NSString(data: data, encoding: NSUTF8StringEncoding)! self.textView.text = (dataString) }
    • 如果你正在更新 UI 元素,你应该确保在主线程上这样做。你的例外是什么?
    • 2015-05-09 02:53:41.830 Reap[99318:2892858] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!' 我假设这意味着我无法在 func 中更新它,所以,我将回到我之前尝试的内容.. 在任务之前声明字符串并更改它在里面。但这给我留下了一个空白变量(它似乎在任务完成时擦除它)。有什么方法可以让函数从结束直到任务结束?
    • @lgbrf 如果将数据保存为变量,然后在更新 UI 的任务块中调用函数,是否可以解决您的问题?
    【解决方案3】:

    Swift 使用 String 而不是 NSString

    但是您可以像这样将NSString 转换为String

    var dataAsString:String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-21
      • 2015-12-21
      • 2016-03-30
      • 2020-11-28
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多