2011-03-28 214 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

相关问题