Я делаю сложное приложение, которое должно делать что-то во многих потоках и часто обновлять интерфейс.
Поэтому я должен добавить много
dispatch_async(dispatch_get_main_queue(), ^{
});
в середине кода для отправки обновлений пользовательского интерфейса в основной поток, и я нахожу это уродливым и разрушительным, как черт.
Итак, у меня есть идея создать подклассы элементов, таких как UILabel
, UITextField
и т. д., переопределяя их методы основного потока, например:
- (void)setAttributedText:(NSAttributedString *)attributedText {
dispatch_async(dispatch_get_main_queue(), ^{
[super setAttributedText:attributedText];
});
}
- (void)setText:(NSString *)text {
dispatch_async(dispatch_get_main_queue(), ^{
[super setText:text];
});
}
- (void)scrollRangeToVisible:(NSRange)range {
dispatch_async(dispatch_get_main_queue(), ^{
[super scrollRangeToVisible:range];
});
}
но опять же, у меня должен быть один и тот же код, разбросанный по всем этим классам.
Есть ли способ лучше?
currentFoo
. В функции установки вы можете иметьdispatch_async
, который устанавливаетself.currentFooLabel.text = currentFoo
. Затем в коде вашего фонового потока в любое время вы можете просто сказатьself.currentFoo = @“newFoo”
или что-то еще, и функция установки позаботится об асинхронной отправке за вас. - person Paulw11   schedule 26.11.2017currentFoo
и текстовым полем, в которое вы хотите поместить это значение вcurrentFooLabel
. См. здесь информацию о установщиках и геттерах target c. - person Paulw11   schedule 26.11.2017self
наsuper
, но этот мой метод не будет работать для геттера-(NSString *)text
, который должен возвращать текст внутри текстового представления... черт! - person Duck   schedule 26.11.2017