Предложения, необходимые для создания архитектуры моего кода
-
18-09-2019 - |
Вопрос
Предыстория
Я пишу часть своего приложения, у которой нет пользовательского интерфейса.Он находится в фоновом режиме, наблюдая за тем, что вы делаете, и рассчитывая время вашей работы.
Не должно быть перекрывающихся времен, и в данных о времени не должно быть разрывов.Если есть что-то из вышеперечисленного, значит, в приложении где-то есть ошибка, и мне нужно получить уведомление.
Чего я хочу
Класс с именем JGDataIntegrityController , который выполняет следующее:
Проверьте хранилище данных на наличие дубликатов.Сканируйте с даты последнего дубликата отчета, сохраненного в NSUserDefaults.
Если будут обнаружены повторяющиеся периоды времени, создайте отчет.
Отправьте отчет.
Если отправка не прошла успешно, выйдите.В противном случае продолжайте.
Удалите дубликаты
Обновите дату последнего повторяющегося отчета в NSUserDefaults
Повторите описанное выше для разрывов данных.
Что у меня есть
Я создал базовый класс, который выполняет всю тяжелую работу по отправке отчета.
Диаграмма классов http://synapticmishap.co.uk/ReportClasses.jpg
JGReportSender содержит следующий код:
-(void)postReport:(NSString *)report {
NSMutableDictionary *form = // Dictionary Holding Report;
NSURLRequest *request = [NSURLRequest requestWithURL:@"http://postURL" postForm:form];
[NSURLConnection connectionWithRequest:request delegate:self];
}
Где я Застреваю
Что мне следует делать, когда отчет будет отправлен?
Методы делегирования:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError*)error
вызываются, когда отчет был отправлен.Но как мне следует взаимодействовать с JGDataIntegrityController?
Моя Дерьмовая Идея
Моя идея состоит в том, чтобы иметь reportStatus
Свойство NSNumber в JGReportSender.Затем, когда вызываются методы делегирования, это обновляется.
reportStatus = 1 означает "отчет отправлен нормально".
reportStatus = 2 означает "проблема с отправкой отчета".
Тогда я мог бы добавить наблюдателя для reportStatus для JGDataDuplicateReportSender и JGDataBreakReportSender.Затем это обработало бы ошибку отправки отчета или продолжилось бы дальше.
Есть какие-нибудь хорошие идеи?
У меня такое чувство, что это действительно грязный способ сделать это.Я также чувствую, что упускаю из виду что-то действительно очевидное.
Есть идеи, как сделать это аккуратно?
Обновить
Я совсем забыл упомянуть - это будет функция 100% подписки.По умолчанию он будет отключен.Он также будет иметь 3 уровня конфиденциальности - от "произошел сбой данных" до "сбой данных произошел после того, как это приложение было активным с этим путем к документу".И отчеты тоже будут анонимными.
Я осознаю все проблемы конфиденциальности - это делается для того, чтобы я мог улучшить программное обеспечение, а не для того, чтобы я мог шпионить за людьми!
Решение
Дайте отправителю отчета delegate
свойство и протокол, по крайней мере, с двумя методами: reportSenderDidSucceed:
и reportSender:failedWithError:
.Отправитель отчета отправит последнее сообщение со своего connection:didFailWithError:
метод, передающий полученный им объект ошибки.
Я очень надеюсь, что вы сделаете эту функцию необязательной.Ожидайте много сердитых / любопытных писем от пользователей (не говоря уже о публичных предупреждениях “не используйте это приложение, потому что оно звонит домой” на веб-страницах), если вы этого не сделаете.
Другие советы
Просто небольшое замечание, чтобы сказать, что если кому-то нужен хороший учебник по внедрению ваших собственных делегатов, как предлагает Питер, я нашел это:
http://cocoadevcentral.com/articles/000075.php
Зацени это.Это превосходно!