Как получить доступ к значениям класса модели в другом контроллере, используя singleton в swift? - PullRequest
0 голосов
/ 18 сентября 2018

Я создал класс с некоторыми переменными и не инициализировал ни одно значение по умолчанию, все переменные должны быть назначены при вызове веб-службы. Итак, я инициализировал экземпляр класса и присвоил значение переменным.

Здесь я хочу получить доступ к этим значениям ко всем файлам классов по всему проекту. Является ли это возможным? Я не хочу использовать какие-либо методы сохранения, такие как основные данные и пользовательские настройки по умолчанию, а также кодируемое локальное хранилище.

Пожалуйста, помогите мне с этим? Мы попытались получить доступ к значению класса модели в другом контроллере представления. Но мы получаем нулевое значение. Заранее спасибо.

//MARK: Shared Instance
static let sharedInstance = Singleton()

//MARK: Local Variable    
var emptyStringArray : [String]? = nil
var completed : Bool!
var id : Int?
var title : String?
var userId : Int?

//MARK: Init Array
private init() { 
}

init(Fromarray  dictionary : [String:Any]) {
    completed = dictionary["completed"] as? Bool
    id = dictionary["id"] as? Int
    title = dictionary["title"] as? String
    userId = dictionary["userId"] as? Int
}

наконец позвонил

class ViewController2: UIViewController { 

override func viewDidLoad() { 
  super.viewDidLoad() 
  let BoolValue = Singleton.sharedInstance.completed 
  print(BoolValue) 
}

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Это очень плохое архитектурное решение.

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

Вы создаете слишком много неоднозначности, создавая необязательную распаковку, которая зависит от сетевого вызова. Что делать, если вызов API завершится неудачно? Что, если интернет-соединение медленное, как вы можете предсказать, что ваш синглтон "в порядке" в данный момент? В большинстве случаев вы будете иметь доступ к nil, и это приведет к сбою вашего приложения.

Я бы посоветовал больше читать по шаблону Singleton (если это необходимо), а также по архитектурным шаблонам в iOS.

0 голосов
/ 18 сентября 2018

Вам необходимо сохранить один объект вашего одноэлементного класса.

static let sharedInstance = Singleton()

Это создаст объект вашего одноэлементного класса.

private init() { } or,

init(fromarray dictionary: [String:Any]) {
    completed = dictionary["completed"] as? Bool
    id = dictionary["id"] as? Int
    title = dictionary["title"] as? String
    userId = dictionary["userId"] as? Int
}

Будет создан еще один объект вашего одноэлементного класса, который будет отличаться от приведенного выше.

Если вам нужен доступ к данным из вашего одноэлементного класса.Создайте свой класс как:

class Singleton {

    static let sharedInstance = Singleton()

    var emptyStringArray: [String]?
    var completed: Bool?
    var id: Int?
    var title: String?
    var userId: Int?

    func initializeData(_ dictionary: [String:Any]) {
        completed = dictionary["completed"] as? Bool
        id = dictionary["id"] as? Int
        title = dictionary["title"] as? String
        userId = dictionary["userId"] as? Int
    }
}

И используйте его как:

override func viewDidLoad() {
    super.viewDidLoad()

    // Initialize with data
    Singleton.sharedInstance.initializeData(["completed": true, "id": 123, "title": "iOS Title", "userId": 572])

    // Access data
    let boolData = Singleton.sharedInstance.completed
    print(boolData)
}
0 голосов
/ 18 сентября 2018

используйте другую функцию для загрузки данных и вызова этого после WebCall

func loadData(Fromarray  dictionary : [String:Any]) {
 completed = dictionary["completed"] as? Bool
 id = dictionary["id"] as? Int
 title = dictionary["title"] as? String
 userId = dictionary["userId"] as? Int
}

вызова после завершения веб-вызова

Singleton.sharedInstance.loadData(FromArray : YourDictoinary)

и доступа к любому проекту через

let title = Singleton.sharedInstance.title
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...