Нужно ли использовать [слабое я], если я делаю сетевой запрос с использованием одноэлементного сетевого сервиса? - PullRequest
0 голосов
/ 01 июля 2018

Предположим, у меня есть сетевой синглтон, который использует SessionManager Alamofire, например:

импорт Alamofire

class Network {
    static let shared = Network()
    private init() {}

    private var sessionManager: SessionManager = {
        let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders

                return SessionManager(configuration: configuration)
    }

    func postRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
        sessionManager.request(url, method: .post, parameters: params).validate().responseData {
            // do something with response
            completion()
        }
      }
}

Который я затем использую в классе обслуживания:

class SomeService {
    static let shared = SomeService()
    private init() {}

    func doSomePostRequest(params: [String: Any]? = nil, completion: (() -> ())? = nil) {
        Network.shared.postRequest(params: params, completion: completion)
    }
}

Затем я делаю запрос и перезагружаю таблицу, используя этот класс обслуживания:

class MyViewController: UITableViewController {
    @IBAction func fetchData(_: Any)  {
        SomeService.shared.doSomePostRequest {
            // do i need to use [weak self] here?
            self.tableView.reloadData()
        }
    }
}

Нужно ли мне по-прежнему использовать [слабое я], чтобы избежать сбоев и циклов сильных ссылок? В любой момент пользователь может закрыть MyViewController, нажав Назад.

Правильно ли я полагаю, что мне это не нужно, поскольку класс обслуживания является одноэлементным? И что, если я сделаю это экземпляром в MyViewController, мне придется использовать [слабое Я]?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы используете слабые ссылки на объекты, чтобы убедиться, что они освобождены, когда они должны быть.

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

0 голосов
/ 03 июля 2018

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

Глядя на ваш код, self, который вас беспокоит, это MyViewController. Если вы создадите сильную ссылку на MyViewController в своем синглтоне SomeService, то MyViewController будет никогда не выпущен, потому что ваш синглтон живет в течение всего срока службы вашего приложения. На самом деле это не цикл сохранения (скажем, циклично), но эффект тот же - MyViewController и все объекты, которые он сохраняет, никогда не будут освобождены.

...