Я показываю информацию из модели данных в пользовательском интерфейсе. Мой текущий подход к выполнению так с помощью делегации следующим образом:Что считается перегрузкой основной нити?
@protocol DataModelDelegate <NSObject>
- (void)updateUIFromDataModel;
@end
Я реализую метод делегата в моем классе контроллера следующим образом, используя НОД, чтобы подтолкнуть обновление пользовательского интерфейса к главной теме:
- (void)updateUIFromDataModel {
dispatch_async(dispatch_get_main_queue(), ^{
// Code to update various UI controllers
// ...
// ...
});
}
Что меня беспокоит, так это то, что в некоторых ситуациях этот метод можно назвать очень часто (~ 1000 раз в секунду, при каждом обновлении нескольких объектов пользовательского интерфейса), что для меня очень похоже на то, что я «рассылаю спам» основной поток с командами.
Это слишком много для отправки в основной поток? Если это так, у кого-нибудь есть идеи о том, что было бы лучшим способом приблизиться к этому?
Я искал dispatch_apply
, но это кажется более полезным при объединении данных, что не то, что мне нужно - я просто хочу пропустить обновления, если они слишком часты, поэтому отправляется только разумное количество обновлений к основной теме!
Я рассматривал возможность использования другого подхода и использования таймера вместо этого для постоянного опроса данных, скажем каждые 10 мс, однако, поскольку обновление данных имеет тенденцию быть спорадическим, я чувствую, что это было бы расточительно.
Комбинируя оба подхода, другой вариант, который я рассмотрел, должен был ждать сообщения об обновлении и отвечать, установив таймер для опроса данных с заданным интервалом, а затем отключив таймер, если данные перестали меняться. Но будет ли это чрезмерно усложнять проблему, и будет ли разумный подход просто работать с постоянным таймером?
редактировать:Добавлен ответ ниже показаны приспособления с использованием источника отправки
Я взглянул на это, но немного запутался в том, как его реализовать. При создании настраиваемого источника отправки представляется единственными параметрами для объединения данных с использованием логического ИЛИ или логического ИЛИ, но то, что я хочу получить самое последнее значение, которое было отправлено только, и отменить все вызовы, которые поставили в очередь из-за загруженного основного потока? – tom1990
Если все, что вам нужно, самое последнее значение, вы можете просто сохранить это где-то еще (например, глобальное) и перезаписать его (поточно-безопасным способом!) Каждый раз, когда вы отправляете новое значение. Затем вы можете прочитать это в своем основном потоке, который будет последним значением. –
Ahh, я понял - так использую источник отправки как средство объединения обновлений уведомлений, когда вещи становятся слишком занятыми и игнорируют значение, которое оно дает, и просто используйте блок, который отвечает на чтение из другого места? Я об этом не думал. Я полагаю, что в этом отношении я мог бы фактически использовать «DISPATCH_SOURCE_TYPE_DATA_ADD» и добавлять по одному для каждого отправленного сообщения - тогда результирующее значение могло бы использоваться для контроля того, сколько сообщений пропускается из-за того, что основной поток слишком занят, чтобы обрабатывать их все. Спасибо за помощь! – tom1990