Предложения, необходимые для разработки моего кода - PullRequest
1 голос
/ 04 января 2010

Фон

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

Не должно быть перекрывающихся времен и не должно быть перерывов во временных данных. Если есть какая-либо из этих вещей, приложение где-то имеет ошибку, и я должен быть уведомлен.

Что я хочу

Класс с именем JGDataIntegrityController, который выполняет следующие действия:

  1. Проверьте хранилище данных на наличие повторов. Сканирование с даты последнего дублированного отчета, сохраненного в NSUserDefaults.

  2. Если найдены повторяющиеся времена, создайте отчет.

  3. Отправьте отчет.

    Если отправка не удалась, выйдите. В противном случае продолжайте.

  4. Удалить дубликаты

  5. Обновление даты последнего дублированного отчета в NSUserDefaults

  6. Повторите вышеизложенное для разрывов данных.

Что я получил

Я создал базовый класс, который выполняет всю тяжелую работу по отправке отчета.

Диаграмма классов 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. Затем он обработает ошибку отправки отчета или продолжит работу.

Есть ли хорошие идеи?

У меня такое ощущение, что это действительно грязный способ сделать это. Я также чувствую, что пропускаю что-то действительно очевидное.

Есть идеи, как это сделать аккуратно?

Update

Я совершенно забыл упомянуть - это будет 100% функция. Это будет отключено по умолчанию. Он также будет иметь 3 уровня конфиденциальности - от «произошел разрыв данных» до «произошел разрыв данных после того, как это приложение было активно с этим путем к документу». И отчеты также будут анонимными.

Я осознаю все проблемы конфиденциальности - так я могу улучшить программное обеспечение, а не шпионить за людьми!

Ответы [ 2 ]

1 голос
/ 04 января 2010

Укажите для отправителя отчета свойство и протокол delegate как минимум двумя способами: reportSenderDidSucceed: и reportSender:failedWithError:. Отправитель отчета отправит последнее сообщение из метода connection:didFailWithError:, передав ему полученный объект ошибки.

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

0 голосов
/ 05 января 2010

Просто короткое замечание, чтобы сказать, если кто-то хочет хорошее руководство по реализации ваших собственных делегатов, как предлагает мне Питер, я нашел это:

http://cocoadevcentral.com/articles/000075.php

Проверьте это. Это отлично!

...