2

CUSTOM_VIEW КЛАСС:Правильно управлять очередью отправки уменьшить телефон нагрев IOS

Я сделал custom_view класса, который вычисляет значение на себе и показывает пользователь после каждых 1 сек. Вычисление значений в custom_view на основе свойств/переменных, хранящихся в экземпляре custom_view.

ViewController КЛАСС:

отобразить некоторые 7 до 9 вида пути создания экземпляра custom_class в классе ViewController.

Поскольку мой custom_class показывает новое расчетное значение через каждые 1 секунду, я использовал dispatch_async для выполнения кода вычисления. Так что это не повлияет на UI Thread.

custom_view.m

static dispatch_queue_t queue; 
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0); 

     dispatch_async(queue, ^(void) 
         { 
          [self calculateViewValue]; 
         }); 



-(void) calculateViewValue 
{ 
int wait = [self generateRandomNumberWithlowerBound:10 upperBound:20]; 

           for (int i = 0; i<= wait; i++) 
           { 
           // value calculation 

            [[NSOperationQueue mainQueue] addOperationWithBlock:^ 
            {custom_view_instance.text = value;}]; 

           sleep(1); 
           } 
} 

Однако после его запуска iPhone нагревается через некоторое время !! Я делаю что-то неправильно/отсутствует/лучший способ сделать это ???

ответ

2

не производить вычисления в представлениях, контроллеры делают это. в любом случае не вызывайте сон в UIKit. может быть лучше: (код должен быть в контроллере .. И он устанавливает текст во взглядах ...) , если вам нужно повторить вычисления, используйте таймер.

Так начинаются с кода аналогично:

uint64_t interval = 1; 
uint64_t leeway = 0; 

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval * NSEC_PER_SEC, leeway * NSEC_PER_SEC); 
dispatch_source_set_event_handler(timer, ^{ 

    // put code here... 
}); 
dispatch_resume(timer); 

некоторые преимущества: 1) ниже, процесс CPU 2) не сна 3) уже асинхронной. 4) вы можете использовать каждый «огонь» времени, чтобы запланировать событие 5) используйте «count» var, чтобы решить, когда следует отключить таймер: в этом случае таймер убивает, используя что-то похожее на dispatch_cancel ... (сохраняя ваш " таймер ")

+0

привет, @ingconti, спасибо за ответ :) Ну, как вы уже упомянули, я согласен с тем, что ваш расчет должен быть выполнен в контроллере. Однако расчет производится в моем классе custom_view. Например. Рассмотрим custom_view представляет PROPERTY [HOUSE/BUILDING], а значение custom_view - RATE свойства. поэтому он основан на свойствах/переменных custom_view. Поэтому я всегда создаю экземпляр custom_view и инициализирую каждый новый custom_view со значением. –

+0

Представления не должны содержать данные или выполнять вычисления. Данные должны быть в модели и расчетах где-то в модели или контрольном слое (в зависимости от деталей реализации). – bbum

+0

ok @bbum, да, я предпочитаю не использовать представление для расчета/хранения данных, которые я делаю на этот раз и сделаю изменения, как вы, ребята, подчеркиваете. Спасибо :) Im, будучи новичком, что я должен отсылать/учиться, чтобы избежать такой ошибки, которую вы указали, и сделать более структурированную реализацию в будущем. –