2017-12-29 22 views
0

Ich habe erfolgreich Daten von einer API geholt und entschlüsselt und habe nun Zugriff auf alle Daten, die ich für den Algorithmus benötige, den ich in meine App schreiben möchte.Verwenden decodierter Daten von einer API in einen Algorithmus

Das Problem ist, dass ich nicht weiß, wie auf diese Daten zugreifen, nachdem ich es entschlüsselt habe, kann ich es sofort nach der Decodierung ausdrucken, aber ich habe keine Ahnung, wie man es in einer anderen Funktion oder Ort in meiner App verwendet.

Hier ist mein Spielplatz:

import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

enum MyError : Error { 
    case FoundNil(String) 
} 

struct Level: Codable { 
    let time: Double 
    let close: Double 
    let high: Double 
    let low: Double 
    let open: Double 
} 

struct Response: Codable { 
    let data: [Level] 

    private enum CodingKeys : String, CodingKey { 
     case data = "Data" 
    } 
} 

func fetchData(completion: @escaping (Response?, Error?) -> Void) { 
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")! 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     guard let data = data else { return } 
     do { 
      if let marketData = try? JSONDecoder().decode(Response.self, from: data) { 
       print(marketData.data[0].open) 
       print(marketData.data[1].open) 
       print("Average=", (marketData.data[0].open + marketData.data[1].open)/2) 
       //completion(marketData, nil) 
       throw MyError.FoundNil("data") 
      } 
     } catch { 
      print(error) 
     } 
    } 
    task.resume() 
} 

fetchData() { items, error in 
    guard let items = items, 
     error == nil else { 
      print(error ?? "Unknown error") 
      return 
    } 
    print(items) 
} 

Wie kann ich .data [0], .data [1] verwenden, ..., woanders?

+0

Sie können Bitte definieren Sie woanders? –

+0

Wie in einer anderen Datei oder Funktion – Wizzardzz

Antwort

1

Ich verstehe nicht, was Ihre eigentliche Problem ist, weil Sie alles geschrieben haben, müssen Sie hier, aber so weit ich verstehe, um Daten passieren

nur uncomment diese Linie completion(marketData, nil)

und in

fetchData() { items, error in 
    guard let items = items, 
     error == nil else { 
      print(error ?? "Unknown error") 
      return 
    } 
    print(items) 
} 

items ist ein Objekt Ihrer struct Response. Sie können diese überall in Ihrem anderen class passieren, durch eine einfach zu schaffen eine andere Variable wie:

var items : Response! 

zum Beispiel:

class SomeOtherClass : NSObject{ 
    var items : Response! 
func printSomeData() 
{ 
print(items.data[0].open) 
print(items.data[1].open) 
print("Average=", (items.data[0].open + items.data[1].open)/2) 
} 
    } 

und in fetchData Methode schreiben dies:

fetchData() { items, error in 
      guard let items = items, 
       error == nil else { 
        print(error ?? "Unknown error") 
        return 
      } 
      let otherObject = SomeOtherClass() 
    otherObject.items = items 
otherObject.printSomeData() 
     } 
+0

Das ist, was ich gesucht habe! Vielen Dank Arun! – Wizzardzz

+0

Gerne helfen. :) –

2

Ihre Daten sind in Ihrem fecthData() Anruf verfügbar. Wahrscheinlich, was Sie wollen, ist Ihre items Variable, wo Sie es drucken. Stellen Sie jedoch sicher, dass Sie den Abschluss in Ihrer fetchData Implementierung aufrufen.

WARNUNG: Nicht getesteter Code.

import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

enum MyError: Error { 
    case FoundNil(String) 
    case DecodingData(Data) 
} 

struct Level: Codable { 
    let time: Double 
    let close: Double 
    let high: Double 
    let low: Double 
    let open: Double 
} 

struct Response: Codable { 
    let data: [Level] 

    private enum CodingKeys : String, CodingKey { 
     case data = "Data" 
    } 
} 

func fetchData(completion: @escaping (Response?, Error?) -> Void) { 
    let url = URL(string: "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG")! 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     guard let data = data else { 
      completion(nil, MyError.FoundNil("data")) 
     } 

     do { 
      if let marketData = try? JSONDecoder().decode(Response.self, from: data) { 
       completion(marketData, nil) 
      } else { 
       completion(nil, MyError.DecodingData(data)) // work on this duplicated call 
      } 
     } catch { 
      completion(nil, MyError.DecodingData(data)) // work on this duplicated call 
     } 
    } 

    task.resume() 
} 

fetchData() { items, error in 
    if let error == error { 
     switch(error) { 
      case .foundNil(let whatsNil): 
       print("Something is nil: \(whatsNil)") 
      case .decodingData(let data): 
       print("Error decoding: \(data)") 
     } 
    } else { 
     if let items = items { 
      print(items.data[0].open) 
      print(items.data[1].open) 
      print("Average=", (items.data[0].open + items.data[1].open)/2) 

      print(items) 
     } else { 
      print("No items to show!") 
     } 
    } 
} 
+0

Vielen Dank! Ich werde diese Methode in einem Spielplatz als Referenz behalten, es funktioniert perfekt – Wizzardzz

Verwandte Themen