
? Райзя ?
30.01.2017
08:31:38
хуй тебе, а не асинхронность

Vitaly
30.01.2017
08:31:46
ну так ок
если он лочит, то какого хера он падает?
значит не лочит нихера

Google

Vitaly
30.01.2017
08:32:31
если б лочил, то другие потоки б не зашли же.

? Райзя ?
30.01.2017
08:32:57
значит там асинхронные вызовы в официальном апи от склайта есть?

Vitaly
30.01.2017
08:33:16
а тут получается, что из одного потока читаем/пишем, а из другого заходим, и тоже пытаемся читать/писать, и оно нас в эксепшен
асинхронные апи есть. Я же об этом и говорю
В официальном апи
речь если что про Xamarin SQLite

? Райзя ?
30.01.2017
08:37:03
какая незадача
как я люблю эпловские продукты за баги
(на самом деле нет)
попробуй спросить в сисярп конфе

Vitaly
30.01.2017
08:38:53
ща попробую..
спасиб

Andrei
30.01.2017
08:41:06
но насколько я помню это не на всех версиях ios платформы
на одних все гут работает на какой-то (вроде 8) может вылететь может нет )

Google


Andrei
30.01.2017
08:43:33
я все запросы обернул в асинхронный лок
что-то типа такого:
public sealed class AsyncLock
{
private readonly SemaphoreSlim m_semaphore = new SemaphoreSlim(1, 1);
private readonly Task<IDisposable> m_releaser;
public AsyncLock()
{
m_releaser = Task.FromResult((IDisposable)new Releaser(this));
}
public Task<IDisposable> LockAsync()
{
var wait = m_semaphore.WaitAsync();
return wait.IsCompleted ?
m_releaser :
wait.ContinueWith((_, state) => (IDisposable)state,
m_releaser.Result, CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
}
private sealed class Releaser : IDisposable
{
private readonly AsyncLock m_toRelease;
internal Releaser(AsyncLock toRelease)
{
m_toRelease = toRelease;
}
public void Dispose()
{
m_toRelease.m_semaphore.Release();
}
}
}
class DB
{
.....
private readonly static AsyncLock _dbLock = new AsyncLock();
public async Task<IList<DataItem>> GetData()
{
using (await _dbLock.LockAsync())
{
return await _database.Table<DataItem>().ToListAsync();
}
}
}


Dmitriy
30.01.2017
09:28:47
Народ, а как вы делаете такие вещи. Вот есть действия, которые нужно выполнять в разных частях программы (набор методов по какому-то признаку). Вы в таких случаях делаете синглтоны, просто статические классы или стандартные классы которые нужно постоянно инициализировать, для выполнения каких-то действий?
Например:
Выполнить запись или выборку из локальной б/д на основе определенных условий, которые тянутся из сети, и там еще идет логика.
Это действие одинаковое в нескольких точках приложения.
Эту логику записи/выборки вы где зачастую реализуете?

Antony
30.01.2017
09:33:08
вот побоюсь сказать насчет iOS, на на бекенде это делается с помощью ORM, в котором действия с БД имплементируют паттерн Active Record(чаще всего его), а подключение к бд выполнено с помощбю синглтона.

? Райзя ?
30.01.2017
09:37:55
ну вкратце про MVC, Viper архитектуру полистай, вот
у рамблера есть хороший пример с кодом на вайпере, воот


Dmitriy
30.01.2017
09:40:24
я всегда в синглтоне держу набор методов с запросами к серверу. и когда что-то надо получить - довольно удобно просто обратиться и получить колеком нужные данные. Такой подход плох чем-то?

? Райзя ?
30.01.2017
09:40:40
сильная связность

Dmitriy
30.01.2017
09:41:41
а в чем связность? Там по сути просто набор методов и блоки на ответ success или failure
юзаются где угодно и из любой точки, удобно и ни к чему не привязывается никак.

? Райзя ?
30.01.2017
09:42:40
это значит, что у тебя в коде бизнес-логики торчит какая-то сущность. И в случае, если что нужно будет изменить, например, реализации методов, параметры там, может какие-то типы внутри или фреймворк, на основе которого работают методы, придется по всему коду исправлять эти вызовы с функциями внутри
ой
переменными в вызовах
в скобочках
в gang of four порицаются синглтоны
возможно! если ты на вход подаешь только сущность и на выходе сущность, то в принципе ок
а, ну и вот еще
я не уверен, но для тестирования это тожэ не очень удобно будет. Типа, если бы использовался DI, можно было бы сразу подставить какой-нибудь заготовленный репозиторий, удовлетворяющий общему протоколу, в одной точке приложения

Google

? Райзя ?
30.01.2017
09:46:37
вооот
ну и еще там немного много принципы solid нарушаются

Dmitriy
30.01.2017
09:47:27
параметры все передают просто словарем.
выглядит прибл так
+(instatype)sharedInstance;
- (void)getUserByParameters:(NSDictionary *)parameters success:(myBlockSucCallback)successCallback failure:(myBlockFailCallback)failureCallback;
Их норм юзать в синглтоне?
в этом синглтоне ничего не обрабатываю, кроме: ошибка или удача, и возвращаю результат, который обрабатывается уже тем, кому этот результат нужен
или лучше синглтон перепесывать на простой класс и постоянно его в каждом контроллере иницилазировать?
перед каждым вызовом?)

? Райзя ?
30.01.2017
09:50:07

Andrew
30.01.2017
09:50:09

Antony
30.01.2017
09:50:22
этож фабрика, нет?

Dmitriy
30.01.2017
09:50:48
ну инициализируется он так:
#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;
}

? Райзя ?
30.01.2017
09:51:22
ну да, синглтон

? Райзя ?
30.01.2017
09:51:52

Antony
30.01.2017
09:52:15
получать разные сущности вызовом чего либо, не фабрика?

? Райзя ?
30.01.2017
09:53:21
в общем практика эта рабочая с синглтоном-репозиторием, но она не слишком способствует расширяемости, нарушает несколько принципов чистого кода и ухудшает модульную тестируемость
зато быстро!)

-_-
30.01.2017
09:54:29
А как правильно-то

Dmitriy
30.01.2017
09:54:35
но этот синглтон всего лишь возвращает то, что сервер присылает, в виде словаря и все) больше никаких действий не выполняет

-_-
30.01.2017
09:54:59
А то столько умных слов, принципов, моделей, фабрик

Antony
30.01.2017
09:55:08

Google

Antony
30.01.2017
09:55:39
а так подход правильный

? Райзя ?
30.01.2017
09:56:06
ааа, чай забыл

Antony
30.01.2017
09:56:27
можно инкапсулировать сущности использущие данный "синглтон" за отдельными классами и будет вам счастье

? Райзя ?
30.01.2017
09:56:58

-_-
30.01.2017
09:57:00

Antony
30.01.2017
09:57:31
Шаблоны проектирования на русском:
https://nixsolutions.github.io/design-patterns/
или книга от банды четырех

Admin
ERROR: S client not available

Antony
30.01.2017
09:58:00
Паттерны проектирования
самих стандартов не существует
есть только гайды и стайл-гайды
на проектирование
НЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕСА

? Райзя ?
30.01.2017
10:01:06

Antony
30.01.2017
10:01:27
Боб Мартин "Чистый код"

? Райзя ?
30.01.2017
10:01:33
архитектура viper хорошо реализует solid . Там еще пример проекта есть

Antony
30.01.2017
10:02:51
а если есть куча времени - можно пойти по хардкору и проникнуться стандартами JEE
после которых либо сходишь сума, либо начинаешь думать наперед

Google

? Райзя ?
30.01.2017
10:03:31
еще советую почитать про анти-паттерн massive controller

Александр
30.01.2017
10:19:03
Ребята, планирую делать встроенные покупки внутри приложения, обязательно ли делать какую то авторизацию для пользователя на своем серваке? Или восстановление покупок можно делать как то по идентификации через apple id клиента ..?

-_-
30.01.2017
10:20:20
А так и покупки и восстановление можно сделать полностью без своего сервера
Если, конечно, у тебя покупки не привязаны как-то к профилю пользователя на твоем сервере

Maxx
30.01.2017
10:21:45

Александр
30.01.2017
10:22:27

-_-
30.01.2017
10:23:38

Александр
30.01.2017
10:24:00
«тебе прилетают» - мне это приложению?

-_-
30.01.2017
10:24:08
При восстановлении точно так же прилетают транзакции, смотришь, что это было, открываешь доступ
да

Александр
30.01.2017
10:24:47
А как сервак эплов определяет что мне отправлять? как идентфицирует7

-_-
30.01.2017
10:25:15
На нем покупки привязаны к Apple ID
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3
Есть метод
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
Вот туда они и прилетают после обработки серверами Apple
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
break;
а вот и обработка новой и восстановленной транзакции (по сути в completeTransaction и в restoreTransaction может быть один и тот же код, открывающий юзеру какие-то плюшки)

Александр
30.01.2017
10:31:00

gafurov
30.01.2017
12:38:46
Ребят подскажите туториал нормальный по snapKit. У них на сайте очень кратко. У меня возникает ошибка: Я в superview добавляю два subview: headerview и footerview. Однако как я понимаю , make.top.equalTo(headerView.snp_bottom) не подцепляет нижнию границу headerview и расширяется на весь экран. Поэтому я не могу поймать target-ы кнопок