2016-02-11 5 views
0

Можно ли ожидать асинхронного запроса (скажем, NSURLSessionDataTask) с использованием семафора.Синхронные запросы HTTP в Swift

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

Синхронные запросы (в фоновом потоке/очереди) имеют преимущество не в том, чтобы быть обратным вызовом.

Ответ в https://stackoverflow.com/a/31563134/466604 показывает только способ достижения этого, но он приходит с предполагаемым унынием. (Наряду с другим обескураживанием от https://devforums.apple.com/thread/9606?tstart=0)

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

+3

Возможного дубликат [запрос Синхронного URL на Swift 2] (http://stackoverflow.com/questions/31557688/synchronous-url-request-on-swift-2) – brimstone

ответ

3

Нет, все не в порядке. Не делай этого.

iOS может даже убить ваше приложение в процессе. Кроме того, посмотрите на обратные вызовы, поскольку они стали следующим шагом в вашем серийном исполнении.

Процессор нуждается в этих циклах, чтобы делать другие вещи, не быть хулиганом!

INSIGHT:

Как @EricD сказал, если исполнение не может по какой-то причине, что нить теряется, пока вы не выйдете из приложения и младший матрос утверждает он.

Этот поток является ценным ресурсом, который не должен быть потрачен впустую, и многое другое более ценным в мобильных операционных системах как iOS.

Процессоры для iPhone не такие мощные, как современные процессоры Desktop или процессоры GPU, которые могут создавать до сотни тысяч потоков.

Если вы используете семафор , вы просыпаетесь, чтобы спросить этот поток через какое-то время, и если условия не были выполнены, вы снова переспали. Обычно это происходит в мс время, но все же, какое-то время процессор обрабатывает что-то бесполезное.

MORE ОЧИСТИТЬ

При определении обратного вызова, как если бы вы были спать, и вы говорите с кем-то.

Не звоните мне, я позвоню вам, когда я буду готов.

Вместо этого, используя семафор, как:

это нормально, если вы звоните мне 1000 ..0 раз, чтобы спросить меня, готов ли я пойти

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

Имейте в виду, что в лучшем случае вы используете семафор, которые ставят тему в сон на некоторое время, а затем еще раз спросить, если это OK, чтобы продолжить.

Если это не так, то эта нить используется все циклы процессора возложенные на него, чтобы спросить вас, если это нормально, чтобы продолжить, что 100% использование процессора в этом потоке оценки просто в состояние.

+0

Этого ответ предполагает, что припаркованная нить (ожидая на семафоре) - это огромная нагрузка на систему. Я не знаком с этим понятием. Если выполнение не выполняется, может быть возвращено значение ... Почему поток должен быть потерян до закрытия приложения? – arithma

+0

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

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