2015-02-23 3 views
0

я взгляну на GCD, и исходя из C++, он приходит естественно писать код таким образом:Управляющий контур резьбы в Objective-C

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    while(YES) { 
    if(<condition>) { 
     /* here I need to call a delegate */ 
    } 
    sleep(1); 
    } 

}); 

Это правильный способ сделать петлю поток объектива-с?

Попытка понять, я искал рамку Reachability, я предполагаю запустить фоновый поток, чтобы постоянно проверять состояние соединения, но я не могу понять, как это происходит.

Редактировать

В принципе у меня есть N объектов, сохраненных на основных данных. Когда все эти объекты установили свое свойство «онлайн» как «ДА», мне нужно запустить уведомление или делегат.

ответ

0

вы можете использовать таймер для чего-то подобного рекурсивного. или вы можете использовать рекурсивный поток с интервалом задержки. ARC behavior within a recursive block это может быть полезным.

0

Я полагаю, это зависит от того, что будет делать ваш код. Было бы лучше подождать нечто вроде NSNotification, а не опросить ваше состояние, но если у вас нет другого выбора, тогда все в порядке.

+0

Я согласен с вами, но я не могу дождаться уведомления, потому что мне пришлось «создать» собственное уведомление. Я объясняю: у меня есть объект N, и я должен ждать, чтобы все стали онлайн; затем запустите обратный вызов –

0

Редко возникает необходимость создания нового постоянного потока с циклом запуска в нем.
Если вам нужно создать некоторые операции в определенном потоке, и эти операции должны связываться с каким-либо другим объектом с помощью делегирования, для этого потребуется новый постоянный цикл цикла.
Например, если вы хотите выполнить все NSURLConnection в фоновом потоке, как только вы начнете соединение в фоновом потоке, поскольку NSURLConnection основан на делегировании, поток будет закрыт сразу после достижения этого метода, и вы потеряете все обратные вызовы.
Как я уже сказал, это очень редко, а также немного сложно.
Концепция GCD очень отличается от потока, является GCD, который решает выполнить ваш блок на нити или другой.
Существует множество версий достижимости снаружи, и насколько я помню, ни один из них не использует конкретный поток, один использует последовательную очередь, но помните, что очереди и потоки - это действительно разные понятия.
Back to you snippet Я никогда не видел такой блок, и я думаю, что это неправильно, GCD будет управлять существованием потока, и вам не нужно создавать цикл запуска.
Возможно, если вы добавите дополнительную спецификацию к своему вопросу, я могу быть более полезным.

+0

Я редактировал вопрос whit больше информации, я благодарен за ваш ответ в любом случае –

+0

Я видел ваше обновление, но я не видел необходимости создавать свой собственный поток, плюс данные ядра не являются потокобезопасными по умолчанию. То, что я вижу, - это простой пользовательский установщик для свойства «онлайн», которое вызывает уведомление, когда оно было установлено в YES, или ключевое значение, наблюдаемое в этом свойстве. Мое предложение состоит в том, чтобы не возиться с потоками, если вам это действительно не нужно, в то время как операция блока GCD приветствуется, но не забывайте отправлять в основной поток все методы, которые обновляют UI или основные данные, если вы используете другие очереди, чем основной очередь. – Andrea

+0

Еще один момент: с петлей в вашей очереди вы блокируете эту очередь навсегда. Если в эту очередь добавлена ​​какая-либо другая операция, она никогда не будет выполнена, потому что бесконечная операция цикла, которую вы добавляете, никогда не закончится. – Andrea

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

  • Нет связанных вопросов^_^