2009-12-23 52 views
1

我开始使用异步,但获取返回的数据变成了一个麻烦。然后我开始使用类方法,我相信它排除了使用委托方法的可能性。所以我保持同步,知道这将是一个问题,但不认为我会遇到这样一个解决方案很难。在保持UI可交互的情况下检索数据的最佳方式是什么?iPhone上的同步NSURLConnection线程

回答

2

同步NSURLConnections在NSOperation内部工作得很好 - 因为你正在同步使用它们,NSOperationQueue交给NSOperations会自动使用后台线程来运行它们(否则你必须做额外的工作)。

让URL连接在后台线程中运行是保持UI响应的关键,这是异步NSURLOperation默认不会执行的操作(查看数据回调所在的线程)。

有时你想处理数据传入(就像你有进度条一样),在这种情况下异步URL连接更好,它们仍然可以在NSOperation中。因为这让你感到沮丧,所以你可能想看一下另一种基于NSOperation的ASIHTTPRequest库,但它似乎可能会让你感觉不那么痛苦(它们有很好的示例代码):

http://allseeing-i.com/ASIHTTPRequest/

2

NSURLConnection同步调用应该能够卡在后台线程中,但我强烈建议您处理'麻烦',并做到正确的方式。在保持UI交互的同时检索数据的最佳方式是使用NSURLConnection的异步方法。

+0

我可能会错误地做后台线程,因为它似乎并没有工作(不正确地做事的一个很好的迹象)。 我可能对“正确的方式”有错误的想法。一旦收到一些数据,它将用于另一种方法的调用。委托方法对此没有帮助。 – woody993 2009-12-23 22:45:35

+0

当你得到你的第一个连接:didReceiveData时,你应该创建一个NSData对象,然后向它添加额外的数据。 – 2009-12-23 23:27:52

+0

@Ben我正在使用类方法,我的理解是,一个NSData对象是不可用的那种方式 – woody993 2009-12-24 04:44:13

1

出于兴趣您在获取数据时遇到了哪些问题?我发现使用异步NSURLConnection和NSNotificaion时,它已经完成是一个相当方便的解决方案。

在你需要数据的类(我通常把它放在init方法)

-(id)init{ 
    ... object setup ... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil]; 
} 

的UpdateView是当连接已完成接收数据

在NSURLConnection的

要调用的方法

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

//Notify that we are finished 
[[NSNotificationCenter defaultCenter] postNotificationName:soapAction object:self]; 

} 

这对我很好用 - NSURLConnection是线程化的,因此UI不会锁定,并在数据完成时得到更新downloadi NG。

+0

一旦收到数据它被用于后续的方法。 – woody993 2009-12-23 22:57:42

+0

@ woody993:那么使用这些数据!追加到'didReceiveData:'中,然后在'didFinishLoading:'中使用完成的数据。您可以在那里处理它或将其附加到通知或使用它分离新线程。 – benzado 2009-12-24 01:39:32

+0

@benzado它不只是单一步骤,后续方法然后将其数据发送到第三种方法 – woody993 2009-12-24 04:43:01