Size: a a a

iOS Developers — русскоговорящее сообщество

2021 November 22

В

Вовка in iOS Developers — русскоговорящее сообщество
*Зашедулено

Вот же, левой пяткой, в плейграунде накинуть
источник

S

Sapar in iOS Developers — русскоговорящее сообщество
ImageView & Label in Vertical Stack View
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
Хаха, спасибо большой за ответ😎
источник

S

Sapar in iOS Developers — русскоговорящее сообщество
Compositional layout
источник

МН

Михаил Назаров... in iOS Developers — русскоговорящее сообщество
А что делать с тем, что guard порождает сильную ссылку?


import Foundation

class Presenter {
   let interactor = Interactor()
   func downloadData() {
       interactor.getTask {[weak self] (data) in
           guard let self = self else {
               print("noself")
               return
           }
           print("waiting")
           sleep(4)
           
           self.update(data: data)
       }
   }
   
   func update(data: String) {
       print(data)
   }
}


class Interactor {
   func getTask(completion: @escaping(String) -> Void) {
       DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
           completion("Hello")
       }
   }
}

var presenter: Presenter? = Presenter()
presenter?.downloadData()
sleep(3)
presenter = nil
print("Goodbay")
источник

k

kkk in iOS Developers — русскоговорящее сообщество
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
смотри:
у тебя есть VIP цикл ссылок (View-Interactor-Presenter), чтобы избежать утечек памяти надо ослабить ссылку на что-то из этого цикла
- Ослабляются ссылки не установкой их как опционалом, а модификатором weak/unowned
- Поскольку вся "долгоиграющая"/асинхронная логика - в интеракторе, то логично в нём и осуществить разрыв этой порочной связи: объявляешь presenter/delegate как weak var

Замыкания осуществляют захват с образованием сильной ссылки. Поэтому внутри них принято ссылки ослаблять - если есть возможность, что за это время объект умрёт, к примеру (интерактор осуществил запрос, а за время ожидания пользователь ушёл с экрана)
guard внутри замыкания можно и не писать, а использовать опциональный self или ещё какой объект, который укажешь вместе с [weak self, someOtherObject] in ...
смысл guard внутри - избавление от опционала - если self ещё существует, то всё ок.
а нет - тогда и делать нечего. - т.е. ничего с этим делать не нужно - нет объекта - нет ссылки
Есть - ок, будет освобождена по выходу из блока
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
А зачем с этим что-то делать? Вот ты скинул код с гвардом. Зачем там гвард?
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
очевидно же - убрать опционал.
в данном случае - для self
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
…. Зачем?
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
я не спросил что делает гвард. Я спросил зачем.
источник

В

Василий in iOS Developers — русскоговорящее сообщество
оплата посимвольно видимо
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
???
- упрощение синтаксиса?
- убрать проверки на наличие значения в объектах... которые будут также опциональными, если  self опционален
- оптимизация времени исполнения - если self = nil, то блок прервёт своё выполнение (а если в нём есть логика - это тоже не последнее дело), а если использовать ? - пойдёт исполнение дальше... бессмысленное разумеется
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Так и нет ответа.

Зачем в том примере guard? Он вообще там нужен?
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
так ответ не ему был
А на вопрос "зачем guard" единственный ответ - убрать опционал.
источник

В

Василий in iOS Developers — русскоговорящее сообщество
а зачем убирать?
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Андрей, т.е. используешь гвард только для убирания опционала?
источник

В

Василий in iOS Developers — русскоговорящее сообщество
как бы имеет смысл если ты прокидываешь какое-то не опциональное поле из self в качестве аргумента дальше
источник

В

Вовка in iOS Developers — русскоговорящее сообщество
Каждый гвард увеличивает время компиляции 🙁
источник

A

Andrey in iOS Developers — русскоговорящее сообщество
опционал - объект или есть или нет. Убрать опционал - не избавиться от знака вопроса, а убедиться, что объект есть
я правильно ответил?
источник