2011-03-28 155 views
2

我想從主線程創建一個單獨的線程並在那裏執行一些進程。例如:當我正在瀏覽我的應用程序屏幕(導航控制器,視圖控制器等)時,我還想要另一個線程 - 在某些上傳過程中應該在後臺進行。iPhone:創建另一個線程並執行一些進程

我如何在iOS開發中實現這一點?請指導我。

謝謝!

回答

7

有很多的選擇,太多的詳盡名單,但也許孵化只是一個額外的線程最簡單的方法是performSelectorInBackground:withObject:,例如

[self performSelectorInBackground:@selector(doSomething:) withObject:nil]; 

- (void)doSomething:(id)object 
{ 
    NSLog(@"I'm running on a separate thread!"); 
} 

還有performSelectorOnMainThread:withObject:waitUntilDone:推回事情,爲UIKit的調度選擇特定的其他線程的種種手段爲主線。

如果您想調整優先級或以更具體的方式填充線程,您可以直接與NSThread交談。在這兩種情況下都要小心,因爲除非您自己創建自己的後臺線程,否則您的後臺線程中不會有自動釋放池。

如果你打算髮布大量的線程,你可能會推NSInvocationOperationsNSOperationQueue。操作隊列可確保操作以最佳方式分配給後臺線程,以滿足您設備所具有的CPU和內核的數量。

你應該完全確定你想要一個後臺線程。作爲一般的經驗法則,如果某些東西能夠同步或異步操作,發佈到主線程,後者是更有效的進行方式,尤其是在電池壽命方面。新的基於塊的異步方法將大量的意大利麪條寫入應用程序執行簡單線性動作的事件驅動代碼中,所以如果你堅持iOS 4及更高版本,那麼就檢查一下。

+0

你好,謝謝。哪一個我應該使用是否「detachNewThreadSelector」(或)「performSelectorInBackground」。請指教。我想知道這個線程創建是如何工作的?它總是(每隔一段時間)調用這個func,並且執行(或)我們需要每次啓動線程的進程。如果我想要如何阻止這個線程運行? – Getsy 2011-03-31 20:22:44

+0

我不認爲它會產生任何可能性 - 很可能其中一個只是叫另一個。一次調用detachNewThreadSelector或performSelectorInBackground將導致指定的選擇器被調用一次。 – Tommy 2011-04-01 11:23:10

-2

你可以用NSOperation做到這一點。閱讀它。

2

下面是一個代碼片段,讓你開始

// start a new thread: 
    [NSThread detachNewThreadSelector:@selector(onNewThread) toTarget:self withObject:nil]; 

- (void) onNewThread{ 
    // do stuff on new thread 
} 
+0

你好,謝謝。哪一個我應該使用是否「detachNewThreadSelector」(或)「performSelectorInBackground」。請指教。我想知道這個線程創建是如何工作的?它總是(每隔一段時間)調用這個func,並且執行(或)我們需要每次啓動線程的進程。如果我想要如何阻止這個線程運行? – Getsy 2011-03-31 20:22:14

0

如果你的目標是iOS 4.0+,我強烈推薦使用ASIHTTPRequest和blocks。

- (IBAction)grabURLInBackground:(id)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setCompletionBlock:^{ 
     // Use when fetching text data 
     NSString *responseString = [request responseString]; 

     // Use when fetching binary data 
     NSData *responseData = [request responseData]; 
    }]; 
    [request setFailedBlock:^{ 
     NSError *error = [request error]; 
    }]; 
    [request startAsynchronous]; 
} 

這是非常簡單的使用和異步運行所有查詢(默認情況下)。

+0

這是網絡操作哥們!他要求爲普通的taks創建線程。 – ShayanK 2012-05-15 10:12:03

+0

我知道這是網絡運營。重新閱讀這個問題,OP詢問如何在後臺上傳。哪個'ASIHTTPRequest'做。 – kubi 2012-05-15 22:45:21

相關問題