2016-12-12 4 views
0

Я работаю над проектом Swift со сложными вычислениями извещения. Я перебираю массив объектов, которые мне нужно выполнить очень сложную операцию, чтобы определить, когда планировать уведомления. В настоящее время я делаю:Быстрая ручка много сложных операций

for item in items { 
    //some logic here 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { 
     //complex operation here, then schedule notification 
    } 
} 

К сожалению, это доказывает быть медленным, так как я делаю это для кучи объектов, которые все пытается использовать ту же очередь. Иногда он не завершает планирование уведомлений до того, как пользователь покинет приложение. Каковы мои возможности улучшить производительность? Я думал, вместо того, чтобы все использовали глобальную очередь с высоким приоритетом, я мог каждый раз создавать новые очереди, чтобы они не ждали друг друга?

+1

Вы профилировали свое приложение, чтобы узнать, что такое узкое место на самом деле? – Undo

+0

Да, дата подсчета дат уведомления очень интенсивная ... мы используем стороннее решение, к сожалению, у нас нет контроля. – Stephen

+0

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

ответ

1
  1. Во-первых, я не думаю, что вам нужно использовать «основной поток» для расчета, основной поток в основном предназначен для обновлений пользовательского интерфейса. Вы должны использовать фоновый поток для обработки этих тяжелых операций и уведомлений о расписании. В противном случае приложение будет очень медленным и не реагирующим (поскольку основной поток занят этими операциями)
  2. Во-вторых, вместо того, чтобы запускать несколько операций с основным потоком, используя цикл for. Вы должны поместить код таким образом.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { 
        for item in items { 
         //some logic here 
         //complex operation here, then schedule notification 
        } 
    
    } 
    

    Как вы не указали код сложной операции, не можете дать никаких рекомендаций по этой части. Не стесняйтесь добавлять последующие вопросы. : D

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