Убить нить или альтернативу - PullRequest
1 голос
/ 26 марта 2011

Есть ли способ, которым я могу убить порождения потока через:

[NSThread detachNewThreadSelector:@selector(serverFetchInThread) toTarget:self withObject:nil];

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

Если есть какой-нибудь другой лучший способ справиться с этой ситуацией, направьте меня.

Ответы [ 2 ]

3 голосов
/ 26 марта 2011

Нет, нет способа убить поток из другого потока.И на то есть веская причина, поскольку нет способа сделать это так, чтобы целевой поток был убит без риска сбоя приложения.

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

Однако, ваш вопрос вызывает пару вопросов:

Во-первых, почему вы используете потоки, а не GCD?Параллельный доступ через GCD или NSOperation - это обычно рекомендуемый способ решения таких проблем.

Во-вторых, если вы разговариваете с сервером, используете ли вы HTTP (в большинстве случаев именно так)?Если да, то почему бы не использовать асинхронные функции NSURL и друзей напрямую?

1 голос
/ 27 марта 2011

Внимательно посмотрите на использование NSOperationQueue.

Вы можете создать его подкласс NSOperation, чтобы завершить взаимодействие с сервером и даже сделать эту очередь последовательной (максимальное число операций = 1).

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

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

Также стоит отметить совместимость. Я бы предпочел использовать GCD и блоки, но для совместимости требуется NSOperationQueue.

...