2011-03-26 196 views
1

有什麼辦法,我可以通過殺死一個線程產卵:殺死一個線程或替代

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

我工作的情況是,在我的主線程我又讓用戶在我的搜索欄輸入數據和什麼用戶輸入我需要發送到服務器在單獨的線程中搜索。現在,如果用戶通過刪除舊數據並輸入新數據來更改他的選擇,我不希望以前的線程浪費時間,殺死它並用新數據產生一個新線程。

有沒有其他更好的方法來處理這種情況,請指導我。

回答

3

不,沒有辦法殺死另一個線程的線程。有充分的理由,因爲沒有辦法這樣做,即殺死目標線程而沒有崩潰應用程序的風險。

直接回答你的問題;你需要有一種標誌,告訴線程它應該停止正在做的事情並退出。

首先,你爲什麼要使用線程和不使用GCD:

然而,一對夫婦的問題,是由你的問題提出?通過GCD或NSOperation進行併發是解決此類問題的一般建議方法。其次,如果您正在與服務器交談,您是否使用HTTP(大多數情況下,情況就是如此)?如果是這樣,爲什麼不直接使用NSURL和朋友的異步功能呢?

+0

謝謝。我正在使用異步HTTP連接。你能否給我們提供一些更多關於使用標誌和指示線程停止運行的信息。我將在主線程中設置標誌,對吧?我如何在單獨的線程中讀取它。 – Abhinav 2011-03-26 19:31:52

+0

只需調用它的'cancel'方法就可以停止NSHTTPConnection。 – peterjb 2011-03-26 19:42:30

+0

這是正確的,但一旦一個asyc服務器調用在一個線程中,我怎麼能從主線程調用它的取消方法。 – Abhinav 2011-03-26 20:39:21

1

請仔細閱讀使用NSOperationQueue

您可以繼承NSOperation以包裝您的服務器通信,甚至可以創建隊列序列(最大操作數= 1)。

如果服務器操作尚未完成並且用戶已生成更多輸入,則可以取消現有的操作並添加新操作。

由於包裝連接的NSOperation的影響,您可以使用簡單的同步版本,並保持連接處理非常簡單。

另外值得一提的是兼容性。我寧願使用GCD和塊,但爲了兼容性,需要NSOperationQueue