Anonymous
у рамблера есть хороший пример с кодом на вайпере, воот
Paks
я всегда в синглтоне держу набор методов с запросами к серверу. и когда что-то надо получить - довольно удобно просто обратиться и получить колеком нужные данные. Такой подход плох чем-то?
Anonymous
сильная связность
Paks
а в чем связность? Там по сути просто набор методов и блоки на ответ success или failure
Paks
юзаются где угодно и из любой точки, удобно и ни к чему не привязывается никак.
Anonymous
это значит, что у тебя в коде бизнес-логики торчит какая-то сущность. И в случае, если что нужно будет изменить, например, реализации методов, параметры там, может какие-то типы внутри или фреймворк, на основе которого работают методы, придется по всему коду исправлять эти вызовы с функциями внутри
Anonymous
ой
Anonymous
переменными в вызовах
Anonymous
в скобочках
Anonymous
в gang of four порицаются синглтоны
Anonymous
возможно! если ты на вход подаешь только сущность и на выходе сущность, то в принципе ок
Anonymous
а, ну и вот еще
Anonymous
я не уверен, но для тестирования это тожэ не очень удобно будет. Типа, если бы использовался DI, можно было бы сразу подставить какой-нибудь заготовленный репозиторий, удовлетворяющий общему протоколу, в одной точке приложения
Anonymous
вооот
Anonymous
ну и еще там немного много принципы solid нарушаются
Paks
параметры все передают просто словарем. выглядит прибл так +(instatype)sharedInstance; - (void)getUserByParameters:(NSDictionary *)parameters success:(myBlockSucCallback)successCallback failure:(myBlockFailCallback)failureCallback; Их норм юзать в синглтоне?
Paks
в этом синглтоне ничего не обрабатываю, кроме: ошибка или удача, и возвращаю результат, который обрабатывается уже тем, кому этот результат нужен
Paks
или лучше синглтон перепесывать на простой класс и постоянно его в каждом контроллере иницилазировать?
Paks
перед каждым вызовом?)
Anonymous
или лучше синглтон перепесывать на простой класс и постоянно его в каждом контроллере иницилазировать?
обычно так и делается. Через инъекцию зависимостей. Через какой-нибудь там Swinject или Typhoon.
Anonymous
перед каждым вызовом?)
++ Вот тоже постоянно этим заморачиваюсь
Anton
этож фабрика, нет?
Paks
ну инициализируется он так: #pragma mark - Initialization + (PApiClient *)sharedClient { static PApiClient *_sharedClient = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:kBaseURLString]]; }); return _sharedClient; }
Anonymous
ну да, синглтон
Anton
получать разные сущности вызовом чего либо, не фабрика?
Anonymous
в общем практика эта рабочая с синглтоном-репозиторием, но она не слишком способствует расширяемости, нарушает несколько принципов чистого кода и ухудшает модульную тестируемость
Anonymous
зато быстро!)
Stanislav
А как правильно-то
Paks
но этот синглтон всего лишь возвращает то, что сервер присылает, в виде словаря и все) больше никаких действий не выполняет
Stanislav
А то столько умных слов, принципов, моделей, фабрик
Anton
а так подход правильный
Anonymous
А то столько умных слов, принципов, моделей, фабрик
ну слова обычные. А правильно писать по стандартам. От которых себе в ноги не выстрелишь
Anonymous
ааа, чай забыл
Anton
можно инкапсулировать сущности использущие данный "синглтон" за отдельными классами и будет вам счастье
Stanislav
ну слова обычные. А правильно писать по стандартам. От которых себе в ноги не выстрелишь
А где можно почитать про стандарты нормально? И желательно с исходниками приложений полностью по стандартам
Anton
Шаблоны проектирования на русском: https://nixsolutions.github.io/design-patterns/
Anton
или книга от банды четырех
Anton
Паттерны проектирования
Anton
самих стандартов не существует
Anton
есть только гайды и стайл-гайды
Anton
на проектирование
Anton
НЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕСА
Anton
Боб Мартин "Чистый код"
Anonymous
архитектура viper хорошо реализует solid . Там еще пример проекта есть
Anonymous
Anton
а если есть куча времени - можно пойти по хардкору и проникнуться стандартами JEE
Anton
после которых либо сходишь сума, либо начинаешь думать наперед
Anonymous
еще советую почитать про анти-паттерн massive controller
Alexander
Ребята, планирую делать встроенные покупки внутри приложения, обязательно ли делать какую то авторизацию для пользователя на своем серваке? Или восстановление покупок можно делать как то по идентификации через apple id клиента ..?
Stanislav
А так и покупки и восстановление можно сделать полностью без своего сервера
Stanislav
Если, конечно, у тебя покупки не привязаны как-то к профилю пользователя на твоем сервере
Max
Например: Выполнить запись или выборку из локальной б/д на основе определенных условий, которые тянутся из сети, и там еще идет логика. Это действие одинаковое в нескольких точках приложения. Эту логику записи/выборки вы где зачастую реализуете?
Однотипные операции и бизнес-логика инкапсулируются в обычный(е) класс(ы). Хелперские функции типа "тянуть из сети", всякие преобразования-кастинги, вытяжки из локальной БД, это всё private func. Сделать классу public interface из 1-2-3 методов и юзать их по мере надобности в нужных VC. VC - только для управления view. Ну то есть для бизнес-логики выстроить собственный API. А на его базе фигачить УЙ (VC + view). Я так...думаю.
Alexander
А так и покупки и восстановление можно сделать полностью без своего сервера
как идентифицируется юзер при восстановлении покупок? у меня идент вариант: либо он про юзер либо не про, в зависимости от этого мы ему даем внутри приложения либо показываем рекламу либо нет.
Alexander
«тебе прилетают» - мне это приложению?
Stanislav
При восстановлении точно так же прилетают транзакции, смотришь, что это было, открываешь доступ
Stanislav
да
Alexander
А как сервак эплов определяет что мне отправлять? как идентфицирует7
Stanislav
На нем покупки привязаны к Apple ID
Stanislav
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3
Stanislav
Есть метод - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
Stanislav
Вот туда они и прилетают после обработки серверами Apple
Stanislav
case SKPaymentTransactionStatePurchased: [self completeTransaction:transaction]; break; case SKPaymentTransactionStateRestored: [self restoreTransaction:transaction]; break; а вот и обработка новой и восстановленной транзакции (по сути в completeTransaction и в restoreTransaction может быть один и тот же код, открывающий юзеру какие-то плюшки)
Zafar
Ребят подскажите туториал нормальный по snapKit. У них на сайте очень кратко. У меня возникает ошибка: Я в superview добавляю два subview: headerview и footerview. Однако как я понимаю , make.top.equalTo(headerView.snp_bottom) не подцепляет нижнию границу headerview и расширяется на весь экран. Поэтому я не могу поймать target-ы кнопок
Zafar
от headerView
Zafar
Как бы footerView перекрывает headerView
Zafar
хотя , визуально на месте все. Я побаловался бэкрангд колор, чтобы поймать это
Anonymous
снепкит
Anonymous
нуу нууу
Anonymous
мм