Болты каркаса очереди задач
Я разрабатываю приложение для iOS и изучаю возможность использования инфраструктуры Bolts от Parse (facebook) для управления сетевыми операциями (используя Alamofire для сетевых запросов).
Мне интересно, есть ли хорошая реализация / шаблон для очереди задач для Болтов. Мне нужно иметь автономную функциональность, и поэтому (думаю) мне нужна какая-то очередь задач, поэтому, если пользователь находится в автономном режиме, все его операции сохранения / создания сохраняются (ставятся в очередь и сохраняются), а затем выполняются, когда у них есть сетевое соединение, также необходимо для повторных запросов. Я посмотрел на очередь NSOperation, поэтому я могу пойти по этому пути, хотя мне нравится, как Bolts делает вещи с BFTask и предпочел бы использовать это.
1 ответ
Я понимаю вашу проблему, но думаю, что вы немного перепутали назначение очереди NSOperation и BFTasks.
BFTasks используются для того, чтобы использовать и создавать асинхронные и синхронные методы / сетевые запросы связным и минималистичным способом. Например, предположим, что необходимо войти в систему пользователя, представить представление поиска, а затем загрузить результаты поисковых запросов пользователя.
Чтобы оптимизировать ваше приложение и иметь пользовательский интерфейс со скоростью 60 кадров в секунду, вам нужно будет выполнить сетевой запрос асинхронно. По-видимому, вы представляете представление поиска только в том случае, если пользователь вошел в систему (используя ваш метод) (этот метод называется "асинхронные задачи в серии"), а затем вы загрузите результаты поиска, используя параллельные асинхронные запросы (подумайте о загрузке обложек фильмов для названия фильма). запрос в iTunes. Они начинают загружаться одновременно, "параллельно" друг другу, поэтому пользовательские изображения загружаются независимо друг от друга). (Принимая во внимание, что это называется "асинхронные задачи параллельно").
Как видно из этого примера, мы можем достичь желаемой логики вместе с желаемой производительностью, только если мы используем последовательные и параллельные асинхронные запросы. Каркас болтов позволяет достигать всей вышеупомянутой логики ОЧЕНЬ связным и удобным способом.
Очередь NSOperation, с другой стороны, позволяет создавать сложную последовательность методов синхронизации и асинхронности. Он даже позволяет получить статус конкретной операции и связать зависимости. Хорошим примером этого является жизненный цикл контроллера.
На вашем месте я бы сначала узнал, как использовать Bolts и очередь NSOperation отдельно друг от друга. Затем, в зависимости от того, что вам действительно нужно достичь в приложении с точки зрения функциональности, я бы начал думать о связывании Bolts и очереди NSOperation в классе или структуре (в случае, если вы используете swift). Например, использование болтов для "онлайн" вещей (выполнение сетевых запросов) и очереди NSOperation для "офлайн" (сохранение последовательности действий, которые пользователь выполняет, находясь в автономном режиме, для выполнения этой последовательности, когда подключение к Интернету возвращается).
Вы можете прочитать больше о NSOperation здесь и о Bolts для iOS здесь.
ОБНОВИТЬ:
С точки зрения шаблона реализации, одно из предложений, которое вы можете рассмотреть, - это создать простой класс / структуру, которая будет отвечать за хранение ("укладку") ваших методов Bolts. Вы можете использовать массивы для последовательной логики и наборы для параллельной. Вы также можете использовать наборы, чтобы легко убедиться, что некоторые запросы выполняются только один раз, поскольку наборы хранят только уникальные объекты. Честно говоря, на мой взгляд, вы должны попытаться реализовать что-то похожее на то, что я описал, потому что сам Bolts (почти наверняка) включает в себя NSOperation и NSOperaitionQueue.
Кстати, так как Parse iOS SDK прямо сейчас является открытым исходным кодом, вы можете увидеть, как они реализуют saveEvenutually
метод, который сохраняет объект, когда интернет-соединение возвращается, и подумайте, как вы могли бы воспроизвести их логику в соответствии с вашими потребностями.