2016-05-19 2 views
0

Я пытаюсь получить данные JSON с адаптационных серверов и распечатать их. Когда я запускаю первую функцию, я ВСЕГДА получаю нуль. Однако, когда я запускаю вторую функцию, она корректно печатает данные. Я предполагаю, что это имеет какое-то отношение к времени, которое требуется для iPhone, чтобы захватить JSON с сервера, но я совершенно не знаю, как его решить. Моя конечная цель - вернуть данные, но я не могу явно сделать это из обработчика завершения.Метод Always Returning Nil

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 
    } 

ответ

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 
}