【问题标题】:Method Always Returning Nil方法总是返回 Nil
【发布时间】:2016-05-19 11:51:41
【问题描述】:

我正在尝试从 fitbit 服务器获取 JSON 数据并将其打印出来。当我运行第一个函数时,我总是得到零。但是,当我运行第二个函数时,它会正确打印数据。我猜这与 iPhone 从服务器获取 JSON 所需的时间有关,但我完全不知道如何解决它。我的最终目标是返回数据,但显然我不能从完成处理程序中做到这一点。

static func getFitbitData(resource: ResourcePath, date: Date) -> Int? {
        var rawData: NSData?
        let request = oauth.request(forURL: NSURL(string: "https://api.fitbit.com/1/user/-/\(resource.rawValue)/date/\(date.toString())/1d.json")!)
        let task = oauth.session.dataTaskWithRequest(request) { data, response, error in
            if error != nil {
                print("[ERROR] An error occured during request: \(error)")
            }
            else {
                print("[SUCCESS] Data retrieved successfully")
                rawData = data!
            }
        }
        task.resume()
        return ParsingEngine.parseFitbitData(ResourcePath.calories, data: rawData!)
    }



static func getFitbitData(resource: ResourcePath, date: Date) -> Int? {
        let request = oauth.request(forURL: NSURL(string: "https://api.fitbit.com/1/user/-/\(resource.rawValue)/date/\(date.toString())/1d.json")!)
        let task = oauth.session.dataTaskWithRequest(request) { data, response, error in
            if error != nil {
                print("[ERROR] An error occured during request: \(error)")
            }
            else {
                print("[SUCCESS] Data retrieved successfully")
                print(ParsingEngine.parseFitbitData(ResourcePath.calories, data: data!))
            }
        }
        task.resume()
        return nil
    }

【问题讨论】:

    标签: ios swift oauth


    【解决方案1】:

    您是对的,该函数在您的数据从服务器填充之前返回。为什么你不能从完成处理程序中做到这一点?这应该有效:

    static func getFitbitData(resource: ResourcePath, date: Date, completion: (data: Int?) -> Void) {
            var rawData: NSData?
            let request = oauth.request(forURL: NSURL(string: "https://api.fitbit.com/1/user/-/\(resource.rawValue)/date/\(date.toString())/1d.json")!)
            let task = oauth.session.dataTaskWithRequest(request) { data, response, error in
                if error != nil {
                    print("[ERROR] An error occured during request: \(error)")
                }
                else {
                    print("[SUCCESS] Data retrieved successfully")
                    let endData = ParsingEngine.parseFitbitData(ResourcePath.calories, data: data!)
                    completion(endData)
                }
            }
            task.resume()
        }
    

    你可以这样称呼它:

    FitbitService.getFitbitData(myResource, date: myDate) { data in
       //work with your data here
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 2015-03-05
      • 2014-08-25
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多