Обновить UIProgressView из фона

У меня есть приложение панели вкладок с тремя вкладками. В моем втором представлении вкладки у меня есть UIProgressView. У меня есть NSTimer в моем методе viewDidLoad, который вызывает метод, который обновляет progressView

progressTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];

Пока все в порядке.

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

Заранее спасибо.


person Neelesh    schedule 10.08.2011    source источник


Ответы (3)


Не рекомендуется обновлять элементы пользовательского интерфейса из фоновых потоков. Кроме того, не рекомендуется изменять элементы пользовательского интерфейса представления, когда пользователь не находится в этом представлении. Вы используете драгоценные системные ресурсы.

Лучший способ - обновить ProgressBar, как только это представление станет активным...

ОБНОВЛЕНИЕ: вы можете увидеть здесь чтобы узнать, как запустить задачу в фоновом потоке. Вы можете настроить свой NSTimer для запуска в указанном вами селекторе. Но опять же, такие вещи могут привести к некоторым странным ошибкам. Лучше избегать..

person Srikar Appalaraju    schedule 10.08.2011
comment
Спасибо. Но я просто пытаюсь смоделировать концепцию здесь. Это будет только для демонстрации и не отправит приложение в магазин приложений. - person Neelesh; 10.08.2011
comment
В дополнение к этому ответу: установите таймер в viewWillAppear и остановите/отпустите его в viewWillDisappear методах вашего viewController. NSTimer сохраняет своего делегата, и если вы этого не сделаете, ваш viewController никогда не будет выпущен. - person Evgeny Shurakov; 10.08.2011
comment
Какую концепцию вы пытаетесь смоделировать? - person Srikar Appalaraju; 10.08.2011
comment
@srikar я пытаюсь показать прогресс системы. аааа..хорошо..Теперь я понял. Мне не нужно обновлять progressView из другого представления. Я могу сделать это и в методе viewWillAppear. Но как мне запустить таймер в фоновом режиме, чтобы count продолжало увеличиваться с течением времени? - person Neelesh; 10.08.2011
comment
@srikar: не могли бы вы мне помочь? - person Neelesh; 10.08.2011
comment
@Neelesh, тебе нужно увидеть мое обновление в ответе. По сути, вам нужно запустить фоновый поток, запустить там свой NSTimer и поддерживать работу потока и таймера. Это должно получить то, что вы хотите... - person Srikar Appalaraju; 10.08.2011
comment
Я следовал этому stackoverflow.com/ вопросов/1421817/ и я думаю, что теперь это работает. Благодарность - person Neelesh; 10.08.2011
comment
Прохладный! если какой-либо ответ действительно помог вам решить вашу проблему, сделайте дополнительный шаг, проголосуйте за этот ответ и отметьте его как выбранный ответ. Это поможет сообществу... спасибо. - person Srikar Appalaraju; 10.08.2011

Вы можете сохранить свойство в ProgressViewController (или даже в делегате приложения), скажем, float, которое отслеживает ход выполнения. Когда вам нужно обновить прогресс, другой ViewController может изменить значение свойства.

Как только представление станет видимым, обновите пользовательский интерфейс (UIProgressView) с viewWillAppear:.

person Mundi    schedule 10.08.2011

вы можете добавить метод в фоновом режиме таким образом

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
// increment the progress here and keep the property of that count in appdelegate 
//
dispatch_async( dispatch_get_main_queue(), ^{
    // Add code here to update the UI/send notifications based on the
    // results of the background processing
});

});

в другом представлении viewWillAppear вы можете установить этот способ: [loadingProgressView setProgress: appDelegate.count];

person Banker Mittal    schedule 08.02.2013