2013-08-08 4 views
2

Прямо сейчас у меня есть более старый код, который я написал много лет назад, что позволяет приложению iOS ставить в очередь задания (отправка сообщений или отправка данных на серверный сервер и т. Д.), Когда пользователь вне форума. Когда пользователь возвращается в Интернет, задачи запускаются. Если приложение переходит в фоновый режим или завершается, очередь сортируется, а затем загружается обратно, когда приложение запускается снова. Я подклассифицировал NSOperationQueue, и мои задания - это подклассы NSOperation. Это дает мне гибкость в том, что для меня предусмотрена структура данных, которую я могу подкласса напрямую (очередь операций), и путем подкласса NSOperation, которую я могу легко запросить, если моя задача не удалась (сервер не работает и т. Д.).Использование GCD для автономной постоянной очереди

Я, скорее всего, оставлю это как есть, потому что, если он не сломался, не исправить это, верно? Кроме того, это очень легкие операции, и я не ожидаю в текущем приложении, над которым я работаю, чтобы в любое время было поставлено очень много задач. Однако я знаю, что есть некоторые дополнительные накладные расходы с использованием NSOperation, а не с использованием GCD напрямую.

Я не верю, что я мог бы подклассифицировать очередь отправки так, как я могу NSOperationQueue, так что для меня будет лишний код, чтобы поддерживать мою собственную структуру данных и загружать ее в & из очереди отправки каждый раз, когда приложение отправлено на задний план, не так ли? Также не знаю, как я буду обрабатывать запрос задания, если он не сработает. Прямо сейчас, если я получаю 500 с сервера, например, в своем операционном коде я отправляю уведомление с глубокой копией неудавшегося объекта NSOperation. Моя пользовательская очередь операций выбирает это уведомление и добавляет задачу к себе. Не знаете, как, если я смогу сделать что-то подобное с GCD. Мне также понадобится простой способ отменить все операции или приостановить очередь, когда сетевое подключение будет потеряно, а затем повторно активировать, когда сетевой доступ будет восстановлен.

Просто надеемся получить некоторые мысли, мнения и идеи от других, которые могли бы сделать что-то подобное или более знакомы с GCD, чем я.

Также стоит отметить, что в iOS 7 есть новая поддержка фоновых задач, но скорее всего это будет моя цель развертывания. Я также не уверен, если он точно сделает то, что мне нужно, поэтому на данный момент просто смотрим на возможность GCD.

Спасибо.

+4

Хотя я уверен, что это можно сделать, вот несколько мыслей с головы. '1.' GCD не имеет встроенной поддержки для отмены; вам придется сворачивать самостоятельно. '2.' Легкое подклассу, например 'NSOperationQueue', поэтому вам придется вести список операций отдельно, а не в вашем подклассе, и это может быть будущим источником ошибок. '3.'' NSOperationQueue' использует 'GCD' изнутри iOS 4+. '4.' Зачем переписывать что-то, что не сломалось? –

+0

Да, ваша точка 4 - это то, что я сказал сам. И да, NSOperationQueue использует GCD под обложками. Я также знаю, что проще всего работать с самым высоким уровнем абстракции, но с некоторыми накладными расходами. Я не пытаюсь решить проблему, которой у меня нет, то есть я не вижу проблем с производительностью, а просто проверяю, так как это более старый код, если имеет смысл обновлять и если что-то мне не хватает в мой более ограниченный опыт работы с GCD, который облегчил бы рефакторинг, чем казалось бы. Скорее всего, уйдет. Благодарю. – fogwolf

ответ

1

Если NSOperation против подачи блоков на НОД когда-либо проявляется как измеримая над головой, проблема заключается не в том, что вы используете NSOperation, то, что ваши операции далеки слишком зернистые. Я ожидал бы, что эти накладные расходы будут эффективно неизмеримы в любой реальной ситуации. (Конечно, вы могли бы придумать тест-жгут для измерения накладных расходов, но только путем совершения операций, которые фактически ничего не делали.)

Используйте высочайший уровень абстракции, который выполняет свою работу. Двигайтесь вниз только тогда, когда твердые данные сообщают вам, что вы должны.

+0

Прекрасно проверяет, что я думал - просто хотел проверить здравомыслие. Благодаря! – fogwolf

Смежные вопросы