Ответ 1
Обычно я предпочитаю объект обещания для этой проблемы дизайна. Объект-обещание может содержать методы для отмены операции, проверки состояния операции и даже содержать блокировки, которые будут выполняться, в зависимости от того, что происходит с операцией (успех, сбой, отмена и т.д.).
Этот объект обещания может быть передан из вида для просмотра или может быть подан с сетевого уровня по нескольким запросам (просмотр A запускает операцию, просмотр B пытается позже отпустить его, но он уже работает, поэтому он получает то же обещание объект).
Это означает, что уровень сервиса или сетевой уровень в этом случае должен представлять, какие операции, запросы, текущие для какого-либо объекта, не так ли? Потому что вы не хотите пинать запрос только для получения объекта обещания, если кнопка должна быть скрыта, если операция уже запущена. Я предполагаю, что вы сохранили бы эти объекты обещания вне вашей модели приложения, так как они не живут между сеансами, а сетевой уровень сохранит их по URL-адресу, но как бы вы обычно обслуживали это обратно с сетевого уровня, не подвергая себя много сетевого уровня к ui?
На сетевом уровне есть удобные методы для использования пользовательского интерфейса для запуска запросов, инициируемых пользователем. Сетевой уровень определяет, был ли запрос уже запущен и возвращает то же обещание. Даже если сетевой уровень начал процесс внутри (автообновление и т.д.), Он все равно может вернуть обещание обратно в пользовательский интерфейс, если пользовательский интерфейс попытается запустить тот же процесс.
Объекты обещания живут только до тех пор, пока операция продолжается. Фактически у меня есть операция, которая является истинным держателем объекта обещания, а сетевой контроллер имеет очередь операций. Затем, когда приходит запрос, я ищу очередь для существования этой операции и, если она существует, возвращает обещание от операции. Если он не существует, я создаю новую операцию, помещаю ее в очередь и возвращаю ее объект обещания.
Интерфейс между пользовательским интерфейсом и задним концом - это разоблаченные методы на сетевом контроллере. Пользовательский интерфейс не знает об операциях, он просто имеет функцию, которая говорит: "Пойдите, обновите это или поймите это" и получите обещание. Ему не нужно знать или заботиться о том, как выполняется задание, он просто знает, что обещание - это способ проверить статус этой операции.
Теперь, если это обновление данных, обещание не требуется для обновлений данных, NSFetchedResultsController
будет обрабатывать это. Обещание в этой ситуации обрабатывает запросы только "я активен" и "отменю меня".