2012-03-20 93 views
-1

以下是我用于在显示UIActivityIndi​​cator时从服务器检索数据的方法。我试图把这些方法放在应用程序委托中,然后从其他类中调用它们,但我不知道如何返回我的JSONData。任何人都可以帮忙吗?objective-c:从服务器返回数据

-(void)startProcess:(NSString *)buildURL{ 


UIActivityIndicatorView *aInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleBlackTranslucent]; 

[aInd setFrame:CGRectMake(0, 0, 50, 50)]; 
[aInd startAnimating]; 

// then call the timeCOnsumingmethod in separate thread. 
[NSThread detachNewThreadSelector:@selector(getData:) toTarget:self withObject:buildURL]; 
} 

- (void)getData:(NSString *)buildURL{ 


NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Query our database for a restaurant's menus 
NSURL *url = [NSURL URLWithString:buildURL]; 
NSError *e; 
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&e]; 

NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
// NSError *error = nil; 

[self performSelectorOnMainThread:@selector(endProcess:) withObject:jsonData waitUntilDone:YES]; 
[pool release]; 

//return jsonData; 
} 

- (IBAction)endProcess:(NSData *)jsonData{ 
// ?????????? 
return jsonData; 
} 
+0

嗯......为什么不为你的web服务请求使用异步API,而不是复杂的'detachNewThreadSelector:toTarget:withObject:'它比来回地释放'performSelector ...'更有意义。我将通过一些异步使用NSURLRequest或第三方网络库的例子。 [这是一个](http://mobileorchard.com/tutorial-json-over-http-on-the-iphone/) – FluffulousChimp 2012-03-20 19:05:08

+0

这个教程很好,但我将如何改变它,以便我在一个单独的类中实现这些方法? – Apollo 2012-03-20 19:15:24

回答

4

不知道为什么得到downvoted,但你的做法是错的。这里有你想要做什么:

  • 添加UIActivityIndi​​catorView
  • 使用NSURLConnection的异步检索数据
  • 使用NSJSONSerialization接收到的JSON解码成的NSDictionary或NSArray的
  • 取出UIActivityIndi​​catorView

最好的办法是将其作为一个独立的类来实现,它需要一个委托对象。你可以实现一个委托协议来指示像'开始网络活动'(你的代理可以用来添加一个微调视图)和'接收到的数据'(这会将解码后的对象传回给委托 - 代理可以删除微调)。

这种方法的好处之一是您可以轻松地设置它,以便在对象释放时取消连接/请求。然后,您只需将请求对象作为属性存储在您的委托中,并且当委托消失时,它将取消分配请求,这会正确取消/清除。

+0

好极了。有没有关于如何使用这些方法创建自己的委托的教程?你能提供一个采用这个委托的样本协议吗?非常感谢! – Apollo 2012-03-20 19:13:20

+1

看看Cocoa中的一些熟悉的委托协议,作为@jsd所指的内容的指南。例如,'UITableViewDelegate'。您将创建一个单独的下载器类,用于保存对委托的引用(例如,您的视图控制器)。该委托符合您在下载器类接口文件中声明的协议或作为单独文件声明的协议。你的协议方法将包括诸如' - (void)downloaderDidBeginDownload:(id)downloader'等。 – FluffulousChimp 2012-03-20 19:32:28

+0

这是类似于你如何显示一个modalview,这也需要一个协议? – Apollo 2012-03-20 21:50:50