Ребята помогите с Realm и сохранением в него массива структур

realm
ios

#1

Суть приложения в отображении таблицы прогноза погоды.
Нужно сделать так, чтобы приложение при отсутствии интернета показывало результаты из кэша который хранится в Realm.
Я не пойму как мне объявить объект массива структур в Realm.

Есть класс категорий

class Category {

let temp: Double
let wind: Double
let clouds: String
let date: String

init?(data: NSDictionary){
    guard let containerTemp = data["main"] as? NSDictionary,
        let temp = containerTemp["temp"] as? Double,
        let containerClouds = data["weather"] as? [NSDictionary],
        let clouds = containerClouds[0]["description"] as? String,
        let containerWind = data["wind"] as? NSDictionary,
        let wind = containerWind["speed"] as? Double,
        let date = data["dt_txt"] as? String else{
            return nil
        }
    self.temp = temp
    self.clouds = clouds
    self.wind = wind
    self.date = date
    
}

}

и функция которая извлекает данные из JSON

class WeatherLoaderAlamo{

var delegate: WeatherLoaderAlamoDelegate?

func loadWeatherAlamo(){

    AF.request("https://api.openweathermap.org/data/2.5/forecast?q=Moscow,ru&units=metric&****").responseJSON{
        (response) in
        if let data = response.data,
            let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary,
            let jsonDict = json["list"] as? NSArray{

            var categories: [Category] = []

            for dict in jsonDict{
                if let category = Category(data: dict as! NSDictionary)
                {categories.append(category)}
                print(categories.count)
            }
            
            
            
            DispatchQueue.main.async {
                print(jsonDict)
            self.delegate?.loaded(categories: categories)
            }
        }
    }
}

}

Как мне правильно объявить класс с реалмом и сохранять в него массив var categories: [Category] = []

Заранее спасибо!


#2

class Category: Object

и к каждому свойству добавить @dynamic

сохранение realm.add(arrayOfObjetcs)


#3

// off-topic

  1. Вы только что спалили свой appid, который как бы нужно держать в тайне. Сейчас для учебы это не критично, но в дальнейшем на боевых проекта лучше хранить отдельно от основного кода.
  2. Избегайте лишних переносов, чтоб форум понял, где начало и конец кода. Например, сейчас начало и конец класса у вас вне блоке форматированного кода.

#4

RexHunt спасибо за помощь. Но если я добавляю к классу Object, то я появляется ошибка, что нет инициализатора.
Я так понимаю нужно создать новый класс и использовать его для реалм. Но тут вопрос как передавать данные из класса реалм

class CategoryRealm: Object {

@objc dynamic var temp = 0.0

@objc dynamic var wind = 0.0

@objc dynamic var clouds = “”

@objc dynamic var date = “”

}

в класс

class Category {

var temp: Double
var wind: Double
var clouds: String
var date: String

init?(data: NSDictionary){
    guard let containerTemp = data["main"] as? NSDictionary,
        let temp = containerTemp["temp"] as? Double,
        let containerClouds = data["weather"] as? [NSDictionary],
        let clouds = containerClouds[0]["description"] as? String,
        let containerWind = data["wind"] as? NSDictionary,
        let wind = containerWind["speed"] as? Double,
        let date = data["dt_txt"] as? String else{
            return nil
        }
    self.temp = temp
    self.clouds = clouds
    self.wind = wind
    self.date = date
}

}

Как мне сохранять правильно данные в класс реалма если я получаю данные из json и передаю в класс Category.

Заранее огромное спасибо! Никак не получается решить вопрос за недостаточностью опыта:(


#5
class Category: Object {
    **@objc**   **dynamic**   **var**  temp = 0.0
    **@objc**   **dynamic**   **var**  wind = 0.0
    **@objc**   **dynamic**   **var**  clouds = “”
    **@objc**   **dynamic**   **var**  date = “”

    convenience init?(data: NSDictionary){
        guard let containerTemp = data["main"] as? NSDictionary,
            let temp = containerTemp["temp"] as? Double,
            let containerClouds = data["weather"] as? [NSDictionary],
            let clouds = containerClouds[0]["description"] as? String,
            let containerWind = data["wind"] as? NSDictionary,
            let wind = containerWind["speed"] as? Double,
            let date = data["dt_txt"] as? String else{
                return nil
            }
        self.temp = temp
        self.clouds = clouds
        self.wind = wind
        self.date = date
    }    
}

#6

Да я понимаю, но при запуске в этом классе происходит фатальная ошибка: fatal error: init() has not been implemented.

я создаю инит override required init (или convinience) но ничего не помогает. Как я понял нужно два отдельных класса создавать, в частности отдельный класс Object для хранения, а не делать класс Category: Object… или я не знаю как быть)


#7

Не нужно ничего создавать. У меня в проекте больше 100 моделей, как думаете, я бы стал такой фигней страдать.

Попробуйте так

convenience init(data: NSDictionary) {
        self.init()
        guard let containerTemp = data["main"] as? NSDictionary,
            let temp = containerTemp["temp"] as? Double,
            let containerClouds = data["weather"] as? [NSDictionary],
            let clouds = containerClouds[0]["description"] as? String,
            let containerWind = data["wind"] as? NSDictionary,
            let wind = containerWind["speed"] as? Double,
            let date = data["dt_txt"] as? String else{
                return
            }
        self.temp = temp
        self.clouds = clouds
        self.wind = wind
        self.date = date
    }