2015-10-01 5 views
0

Я сталкиваюсь с ситуацией, когда я не могу правильно обрабатывать NSTimer.Как правильно обрабатывать вызовы NSTimer?

В моем приложении у меня есть опция чатов пользователя (я не использую XMPP из-за проекта с низким бюджетом, но чат работает только через вызовы API). Я запланировал таймер с интервалом в 15 секунд. Если будут доступны какие-либо новые чаты, я получу их и обновлю чат.

Вот рабочий сценарий:

  1. Как это UITabbar основе приложение, пользователь придет на вкладку «Чат».
  2. У пользователя будет список лиц, с которыми он может общаться.
  3. Пользователь выберет любого пользователя - нажмет на экран чата.
  4. Если все локально сохраненные чаты будут видны, и вызов API будет выполнен для новых чатов, при успехе (или ошибке) вызова API, таймер будет планировать синхронизацию чатов с интервалом 15 секунд.
  5. Если пользователь возвращается (поп), в методе viewDidDisappear:, я недействителен (работает) таймер.

В моем модульном тестировании, если я буду постоянно нажимать & поп в/из экрана чата, будет установлено несколько экземпляров этого таймера. Я подозреваю, что это НЕПРАВИЛЬНО.

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

+0

Зачем использовать таймер вообще? Кажется, очень неуклюжим. – Droppy

+0

Если вы тусклый использовать таймеры, нужно, чтобы сохранить то, так что вы можете уничтожить, когда пользователь оставляет вид. – rob180

+0

Вы также можете взглянуть на [это] (https://github.com/search?l=Objective-C&q=parse+chat&ref=searchresults&type=Repositories). – rob180

ответ

1

Прежде всего, почему вы не изучает возможность принудительного уведомления? Опрос сервера каждые 15 секунд - плохой дизайн :-(.

Во-вторых, когда дело доходит до NSTimer, важно начать и остановить их из той же темы. Я бы посоветовал вам инкапсулировать код запуска/остановки таймера в ниже блока всегда обеспечения вы имеете дело на главном потоке с таймером.

dispatch_async(dispatch_get_main_queue(), ^{ 

}); 
+0

Спасибо за ваш ответ, я ценю ваш совет, один вопрос, который нужно прояснить, мое приложение не полностью основано на чате, это очень простая (только 1-1 и текстовая) функциональность. Вы правы, что сервер опроса каждые 15 секунд не очень хорош. Я уверен, что добавить таймер в очереди отправки для лучшей производительности, но все же подход плохой, есть ли другой способ выполнить эту задачу? – Hemang

+0

1 сек, вы предложили push-уведомление, как именно? Можете ли вы дать несколько советов? – Hemang

+1

Да, как я уже сказал, исследуйте уведомления Apple Push. Его чистый, быстрый и экономит сетевые вызовы. С помощью push-уведомлений вы можете отправлять минимальные данные, чтобы уведомить свое приложение о том, что есть что-то, доступное после того, как ваше приложение получит уведомление APNS, вызовет сервер и обновит ваш просмотр чата. – Abhinav

0

Это способ, как правило, работать с NSTimer. Надеюсь, поможет.

@implementation MainViewController{ 
    NSTimer *myTimer 

} 

- (void)startTimer{ 
    //Prevents multiple timers at the same time. 
    [myTimer invalidate]; 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(update) userInfo:nil repeats:YES]; 
} 

- (void)update 
{ 
    //Stops the timer if the view in not on the screen 
    if (!(self.isViewLoaded && self.view.window)) { 
     [myTimer invalidate]; 
    } 
} 

@end 
+0

Но для извлечения новых чатов - это основная функциональность приложения, и, применяя ваш код, он перестанет получать новые чаты (поскольку мы аннулируем таймер). Так что это не поможет – Hemang

+0

Итак, вы хотите что-то, что работает все время? Даже если приложение не в этом представлении? – rob180

+0

Да, это то, что я уже реализовал, но проблема возникает, когда я постоянно нажимаю/выхожу из контроллера вида, где таймер настраивается – Hemang

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