Swift - Почему в AFHTTPSessionManager требуется инициализация (кодер)?

Я не очень опытен в iOS-разработке. При создании подкласса AFHTTPSessionManager XCode предложил мне включить требуемый init(coder):

import UIKit

let _sharedAPIManager = APIManager(baseURL: NSURL(string: API_URL)!)

class APIManager: AFHTTPSessionManager {

    /**
     * Singleton service 
     * (https://github.com/hpique/SwiftSingleton)
     */
    class var sharedInstance : APIManager {
        return _sharedAPIManager
    }

    init(baseURL url: NSURL!) {
        super.init(baseURL: url, sessionConfiguration: nil)

        self.responseSerializer = AFJSONResponseSerializer() as AFJSONResponseSerializer
        self.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer

        self.requestSerializer.setValue(API_KEY, forHTTPHeaderField: "X-Api-Key")
        self.requestSerializer.setValue("3", forHTTPHeaderField: "X-Api-Version")
    }

    // this was inserted by XCode
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

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

Связанный вопрос Класс не реализует обязательные члены своего суперкласса содержит некоторую информацию, но означает ли это, что она понадобится всем классам Swift, расширяющим классы Objective-C?


person Kosmetika    schedule 28.03.2015    source источник
comment
Вы уверены, что этот код возвращает экземпляр singleton, init должен быть private , если вам нужно получить экземпляр, который вам нравится, var x = APIManager. sharedInstance , это правильно?   -  person Nata Mio    schedule 06.01.2016


Ответы (1)


initWithCoder: и encodeWithCoder: используются каждый раз, когда вы кодируете и декодируете объекты, обычно для записи/чтения с диска. Вы правы, что раскадровки используют это, но это также очень распространенный способ сохранения данных между запусками приложений.

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

person Aaron Brager    schedule 28.03.2015