John
Всем привет. Ребят, помогите плз. Есть массив фоток, загружаю его на Дропбокс. Как сделать чтобы они грузились не синхронно, а именно по очереди? Пытался вот так, но все равно они одновременно заливаются.
John
John
Хочу просто прогресс бар сделать для каждой фотки отдельно, а так получается он постоянно сбивается загрузкой другой фотки
Aleksey
У тебя сама загрузка, похоже, выполняется асинхронно.
John
Да, вполне может быть, а как сделать так, чтобы этот блок как бы вообще не запускался, пока предыдущая загрузка не закончится?
John
Как вариант, конечно, вызывать новую загрузку из completion'a
Gregory
dispatch_sync на сериале, и что происходит ?
John
Грузии картинки параллельно, если ставить брейкпоинт на тот же прогресс, то виду в начале 0.07 0.14 0.21, а потом оп и опять 0.07 и тд
Gregory
хорошо, первый раз фор прошел, первая задача по загрузке запустилась, что будет когда вторая картинка начнет грузиться ?
John
Ну будет идти загрузка одновременно... соответсвенно то первая загрузка вызывает completion, то вторая...
John
У меня один progress view в контроллере, который зависит от того, что возвращается в completion. И поэтому он постоянно скачет с начала в конец, когда приходит прогресс от разных картинок
Gregory
попробуй вместо DISPATCH_QUEUE_SERIAL поставить NULL, и включить логирование, посмтореть что когда запускается
John
Не совсем знаю что такое логирование, но пойдя простым путём и наставив нслогов в ключевых местах стало понятно, что в начале запустились все загрузки, потом вызывается прогресс, и под конец почти одновременно вызвались все комплишины с окончанием загрузки
Stanislav
У тебя дропбокс клиент скорее всего фотки асинхронно грузит сам по себе
Stanislav
От того, что ты ему таски кинул в serial очереди ничего толком не меняется
John
Ну, у меня тогда только вариант с рекурсией
Ilkhom
нужно поставить барьеры между вызовами потоков, хотя все можно сделать легче
Ilkhom
и да легче это с рекурсией
Stanislav
С таким же успехом можно в обычном цикле кинуть все таски. Смысл совершенно такой же. Если нужен отдельный прогресс бар для каждой фотки - юзай progress блок и там уже меняй состояние компонента, соотвествующего фотке
John
Хах, понял) спасибо. Ну тогда пойду пилить рекурсию, а потом читать про барьеры
Stanislav
Если надо грузить именно по одной, то есть смысл посмотреть методы dropboxClient, там может быть настройка количества потоков
Stanislav
Gregory
Это точно, там может быть все по другому
Stanislav
Ах да. #whois
1) iOS разработчик в небольшой фирме. Социалочки и сервисы знакомств
2) Objective C, Java
3) Могу поделиться знаниями
4) Новые интересные контакты
5) РФ
6) GitHub
John
Это что за строчка?
Anthony
Я бы попробовал сделать через NSOperationQueue, там можно указать количество потоков и добавить операциий в очередь.
Anthony
Вот скажите мне лучше, блоки в Obj-C - это всё-таки классы или объекты?
Stanislav
Stanislav
Это что за строчка?
У тебя в коде этого нет, думал, что у сдк дропбокса есть такая настройка. Пока не вижу(
Stanislav
Печаль, ее там и нет. Странно, конечно. В том же SDWebImage (картинки с веба грузит с кэшированием) - такая настройка есть. В AFNetworking тоже есть MaxConcurrentOperationCount.
Anthony
А можно ссылку на эту либу?
Anthony
Она открытая?
Stanislav
Вопрос по вот этому
https://github.com/dropbox/dropbox-sdk-obj-c
Stanislav
Я упоминал это
https://github.com/rs/SDWebImage
и это
https://github.com/AFNetworking/AFNetworking
Arthur
for ...
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
загрузка картинки + в блоке завершении вызов dispatch_group_leave(group);
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// end for
Это не поможет?)
John
а вот это куда писать: dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
John
?
John
а то у меня заблочился UI и все, никто больше никуда не едет
Stanislav
В чем вообще задача? Грузить фотки именно по одной или все-таки просто нужен один общий прогресс для всех загрузок?
John
ну в принципе, можно и общий прогресс. Но его вообще не знаю как сделать, поэтому думал грузить по одной.
John
в сдк не нашел варианта посылать все кучей
Stanislav
Можно совсем в лоб. Делаешь массив float'ов, с размером, равным количеству фоток. В блоке прогресса обновляешь значение соотвествующего элемента массива. Затем просто складываешь все элементы и сумму делишь на количество фоток, получается общий прогресс - его и показываешь
John
вроде не совсем так... мне же нужно знать общий размер всех фоток, а не их кол-во, и его делить на скачанный размер, Разве не так?
Stanislav
Нет, у тебя в блоках уже считается прогресс для каждого файла
Stanislav
Там же видно, отправленное делится на полный размер
John
ааа, я понял
Stanislav
То есть в блоки прилетает что-то вроде
0 0,1 0,4 0,8 1
в переменной progress
John
да, да, понял
John
но тогда такая штука, получается если будет фоток 20, не будет ли блок какое-то время типа отматываться назад? Одну фотку прогрузит там допустим до 0.14, а потом добавится фотка с 0.07 и получится, что среднее у них меньше... и он откатится назад
Stanislav
Нет, ты же всегда делишь на одно число. Это не среднее
John
да, все
John
не подумал
Stanislav
(0,5 + 0 + 0 + 0 + 0)/5
(0,5 + 0,2 + 0 + 0 + 0)/5
John
все верно, да, хороший вариант
John
так-с, а еще такая проблема... как понять к какой фотке прогресс соответсвует, в блоке же этого нет? то есть по какому индексу записывать в массив прогрессов?
Stanislav
после работы с dateString:
int i = [photosArray indexOfObject:photo];
и юзать ее в блоке
John
ну да, вроде понятно, спасибо)
Stanislav
Когда будешь обновлять массив, считать сумму и дергать UI - делай это с помощью dispatch_async в мейн тред. Так у тебя не будет проблемы с одновременным чтением и записью массива
Stanislav
Вот так:
float progress = ...
dispatch_async(dispatch_get_main_queue(), ^{
array[i] = progress;
// посчитать сумму элементов array, поделить на общее количество
// дернуть UI
});
John
ага, понял
Anonymous
У кого были проблемы с нанонаушнмками?
Илья
Семён
Бабалёша
Вдруг кто-то сталкивался: захват изображения с камеры, SDK отдает на препроцессинг три массива с данными формата YUV (поканально) и stride к ним. Как из них собрать CIImage?
Antontsue
Там чет декодить надо из yuv
Antontsue
Это же вроде цветовая можель, легче всего наверно в шейдере передекодить, там преобразование простое достптгчно
Влад
Ребят, есть кто работал с Vapor?
Есть желание написать свой сервер. Как раз выкатили фреймворк для swift.
На хабре крайне мало информации.
Igor
А почему выбор пал на vapor, а не на perfect ? (Только присматриваюсь)
Влад
Antontsue
Oleksii
А Go и Python и Java ?)
Antontsue
Go называют перспективным
Emil
всем доброго времени суток! кто подскажет перестал открываться callback, авторизируется норм а callback не открывает в приложении. URLScheme установлен
Emil
xcode 8
Shakhzod
Andrey
Alexander
Ребята подскажите
Alexander
как быстро такую анимацию сделать?