我是swift的新手,在swift 4.0中做一个项目从Fitbit API获取数据并得到一个奇怪的问题,我的url任务不再发送任何urlrequest但跳过所有代码直到task.resume,并且不什么都回来了。任何人都可以帮助我PLZ。代码如下所示
import UIKit
class FitbitAPI{
static let sharedInstance : FitbitAPI = FitbitAPI()
var parsedJson : [Any]? = nil
func authorize(with token: String){
let accessToken = token
let baseURL = URL(string: "https://api.fitbit.com/1/user/-/activities/steps/date/today/1m.json")
let request = NSMutableURLRequest(url:baseURL!)
let bodydata = "access_token=\(String(describing: accessToken))"
request.httpMethod = "GET"
request.setValue("Bearer \(String(describing: accessToken))", forHTTPHeaderField: "Authorization")
request.httpBody = bodydata.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {[weak self] (data, response, error) in
if let error = error {
print(error)
}
if let data = data, error == nil{
do {
self?.parsedJson = (try JSONSerialization.jsonObject(with: data, options: []) as? [Any] )
print(String(describing: self?.parsedJson))
}catch _{
print("Received not-well-formatted JSON")
}
}
if let response = response {
let httpResponse = response as! HTTPURLResponse
print("response code = \(httpResponse.statusCode)")
}
})
task.resume()
}
}
答案 0 :(得分:0)
正如@Larme在评论中暗示的那样,let task =
行和task.resume()
行之间的所有代码都是回调。意味着在任务完成之前它不会被调用。将断点放在该回调中(例如在if let error = error line
上),看看它们是否被击中。
此外,您的URL任务是此方法中的局部变量。这意味着在回调甚至可以执行之前,它完全有可能在此方法结束时从内存中释放。如果你想保证它在内存中保持足够长的时间以达到完成回调,你需要在方法之外引用任务。