mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
197 lines
8.2 KiB
Swift
197 lines
8.2 KiB
Swift
//
|
|
// ChartsDataManager.swift
|
|
// GraphTest
|
|
//
|
|
// Created by Andrei Salavei on 3/11/19.
|
|
// Copyright © 2019 Andrei Salavei. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
#if os(macOS)
|
|
import Cocoa
|
|
#else
|
|
import UIKit
|
|
#endif
|
|
|
|
public class ChartsDataManager {
|
|
public static func readChart(item: [String: Any], extraCopiesCount: Int = 0, sync: Bool, success: @escaping (ChartsCollection) -> Void, failure: @escaping (Error) -> Void) {
|
|
let workItem: (() -> Void) = {
|
|
do {
|
|
var collection = try ChartsCollection(from: item)
|
|
for _ in 0..<extraCopiesCount {
|
|
for valueIndex in collection.chartValues.indices {
|
|
collection.chartValues[valueIndex] .values += collection.chartValues[valueIndex].values
|
|
}
|
|
guard let firstValue = collection.axisValues.first,
|
|
let lastValule = collection.axisValues.last else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
let startItem = lastValule.addingTimeInterval(.day)
|
|
for valueIndex in collection.axisValues.indices {
|
|
let intervalToAdd = collection.axisValues[valueIndex].timeIntervalSince(firstValue)
|
|
let newDate = startItem.addingTimeInterval(intervalToAdd)
|
|
collection.axisValues.append(newDate)
|
|
}
|
|
}
|
|
if sync {
|
|
success(collection)
|
|
} else {
|
|
DispatchQueue.main.async {
|
|
success(collection)
|
|
}
|
|
}
|
|
} catch {
|
|
DispatchQueue.main.async {
|
|
assertionFailure("Error occure: \(error)")
|
|
failure(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
if sync {
|
|
workItem()
|
|
} else {
|
|
DispatchQueue.global().async(execute: workItem)
|
|
}
|
|
}
|
|
|
|
public static func readChart(data: Data, extraCopiesCount: Int = 0, sync: Bool, success: @escaping (ChartsCollection) -> Void, failure: @escaping (Error) -> Void) {
|
|
let workItem: (() -> Void) = {
|
|
do {
|
|
let decoded = try JSONSerialization.jsonObject(with: data, options: [])
|
|
guard let item = decoded as? [String: Any] else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
var collection = try ChartsCollection(from: item)
|
|
for _ in 0..<extraCopiesCount {
|
|
for valueIndex in collection.chartValues.indices {
|
|
collection.chartValues[valueIndex] .values += collection.chartValues[valueIndex].values
|
|
}
|
|
guard let firstValue = collection.axisValues.first,
|
|
let lastValule = collection.axisValues.last else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
let startItem = lastValule.addingTimeInterval(.day)
|
|
for valueIndex in collection.axisValues.indices {
|
|
let intervalToAdd = collection.axisValues[valueIndex].timeIntervalSince(firstValue)
|
|
let newDate = startItem.addingTimeInterval(intervalToAdd)
|
|
collection.axisValues.append(newDate)
|
|
}
|
|
}
|
|
if sync {
|
|
success(collection)
|
|
} else {
|
|
DispatchQueue.main.async {
|
|
success(collection)
|
|
}
|
|
}
|
|
} catch {
|
|
DispatchQueue.main.async {
|
|
assertionFailure("Error occure: \(error)")
|
|
failure(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
if sync {
|
|
workItem()
|
|
} else {
|
|
DispatchQueue.global().async(execute: workItem)
|
|
}
|
|
}
|
|
|
|
public static func readChart(file: URL, extraCopiesCount: Int = 0, sync: Bool, success: @escaping (ChartsCollection) -> Void, failure: @escaping (Error) -> Void) {
|
|
let workItem: (() -> Void) = {
|
|
do {
|
|
let data = try Data(contentsOf: file)
|
|
let decoded = try JSONSerialization.jsonObject(with: data, options: [])
|
|
guard let item = decoded as? [String: Any] else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
var collection = try ChartsCollection(from: item)
|
|
for _ in 0..<extraCopiesCount {
|
|
for valueIndex in collection.chartValues.indices {
|
|
collection.chartValues[valueIndex] .values += collection.chartValues[valueIndex].values
|
|
}
|
|
guard let firstValue = collection.axisValues.first,
|
|
let lastValule = collection.axisValues.last else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
let startItem = lastValule.addingTimeInterval(.day)
|
|
for valueIndex in collection.axisValues.indices {
|
|
let intervalToAdd = collection.axisValues[valueIndex].timeIntervalSince(firstValue)
|
|
let newDate = startItem.addingTimeInterval(intervalToAdd)
|
|
collection.axisValues.append(newDate)
|
|
}
|
|
}
|
|
if sync {
|
|
success(collection)
|
|
} else {
|
|
DispatchQueue.main.async {
|
|
success(collection)
|
|
}
|
|
}
|
|
} catch {
|
|
DispatchQueue.main.async {
|
|
assertionFailure("Error occure: \(error)")
|
|
failure(error)
|
|
}
|
|
}
|
|
}
|
|
|
|
if sync {
|
|
workItem()
|
|
} else {
|
|
DispatchQueue.global().async(execute: workItem)
|
|
}
|
|
}
|
|
|
|
public static func readCharts(file: URL, extraCopiesCount: Int = 0, sync: Bool, success: @escaping ([ChartsCollection]) -> Void, failure: @escaping (Error) -> Void) {
|
|
let workItem: (() -> Void) = {
|
|
do {
|
|
let data = try Data(contentsOf: file)
|
|
let decoded = try JSONSerialization.jsonObject(with: data, options: [])
|
|
guard let items = decoded as? [[String: Any]] else {
|
|
throw ChartsError.invalidJson
|
|
}
|
|
var collections = try items.map { try ChartsCollection(from: $0) }
|
|
for _ in 0..<extraCopiesCount {
|
|
for collrctionIndex in collections.indices {
|
|
for valueIndex in collections[collrctionIndex].chartValues.indices {
|
|
collections[collrctionIndex].chartValues[valueIndex] .values += collections[collrctionIndex].chartValues[valueIndex].values
|
|
}
|
|
guard let firstValue = collections[collrctionIndex].axisValues.first,
|
|
let lastValule = collections[collrctionIndex].axisValues.last else {
|
|
return
|
|
}
|
|
let startItem = lastValule.addingTimeInterval(.day)
|
|
for valueIndex in collections[collrctionIndex].axisValues.indices {
|
|
let intervalToAdd = collections[collrctionIndex].axisValues[valueIndex].timeIntervalSince(firstValue)
|
|
let newDate = startItem.addingTimeInterval(intervalToAdd)
|
|
collections[collrctionIndex].axisValues.append(newDate)
|
|
}
|
|
}
|
|
}
|
|
if sync {
|
|
success(collections)
|
|
} else {
|
|
DispatchQueue.main.async {
|
|
success(collections)
|
|
}
|
|
}
|
|
} catch {
|
|
DispatchQueue.main.async {
|
|
assertionFailure("Error occure: \(error)")
|
|
failure(error)
|
|
}
|
|
}
|
|
}
|
|
if sync {
|
|
workItem()
|
|
} else {
|
|
DispatchQueue.global().async(execute: workItem)
|
|
}
|
|
|
|
}
|
|
}
|