2011-09-05 110 views
2

我有一个名为“同步”按钮。当窃听/把它压将数据发送到网络服务器和服务器(有什么需要一段时间,并冻结GUI /按钮)检索答案让我怎么添加一个“请等待”和活动的指标,直到从服务器中的数据/答案到达并且文本/指示符被删除并由来自服务器的回答取代?显示活动指示器的动画时,按下按钮

此代码冻结我的应用程序:

- (IBAction) syncButtonTapped 
{ 

[syncButton setEnabled:NO]; 
//resultText.text= @"Bitte warten ..."; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docDir = [paths objectAtIndex: 0]; 
NSString *docFile = [docDir stringByAppendingPathComponent: @"deck.txt"]; 
NSString *post = [NSString stringWithContentsOfFile:docFile encoding:NSUTF8StringEncoding error:nil]; 


NSString *post2 = [post stringByReplacingOccurrencesOfString:@"\n" withString:@","]; 
NSString *post3 = [post2 stringByReplacingOccurrencesOfString:@"\r" withString:@""]; 
NSString *post4 = [NSString stringWithFormat:@"{\"results\":[%@]}",post3]; 
NSString *urlString = [NSString stringWithFormat:@"http://storecheck.cortona.de/fetchresults.php?results=%@",[post4 stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]]; 
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"GET"]; 
NSString *data4 = @""; 
[data4 writeToFile: docFile atomically: NO encoding: NSUTF8StringEncoding error:nil]; 
//send request & get response 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
} 

我是一台Mac Mini的工作与iOS 10.6.7

+0

我还喜欢将黑色背景,0.5 alpha UIView放在一切之前,以使它们变暗并禁用任何与UI元素的用户交互。 – bdares

+0

输入被禁用,所以不想这个,不需要这个,你的意思是 –

+0

http://stackoverflow.com/questions/593234/how-to-use-activity-indicator-view-on-iphone – PJR

回答

4

你同步请求阻塞UI线程,这就是为什么活动的指标将无法启动。由于多种原因,您应该异步使用NSURLConnection,这就是其中之一。

相反的:

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

务必:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[conn start]; 
[conn release]; 

然后让returnData实例变量和实施NSURLConnectionDeletgate方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    returnData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [returnData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
    // do whatever you need with your string and stop activity indicator 
    [returnData release]; 
} 
+0

和我怎么做? –

+0

我已将代码添加到我的答案中。被检测的 –

+0

; token before:token on: - (void)connection:(NSURLConnection *)连接didReceiveResponse:(NSURLResponse *)响应 –

1
//Right before the request is made 
UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[indicatorView setFrame:CGRectMake(0, 0, 16, 16)]; 
[indicatorView setHidesWhenStopped:YES]; 
[indicatorView startAnimating]; 
[self.view addSubview:indicatorView]; 
// Create your request (synchronously or asynchronously) 
... 

// When request is done 
[indicatorView stopAnimating]; 
[indicatorView release]; 
+0

它没有出现我必须在某处创建视图或将其添加到标题中?它与以前一样,当我添加你的代码? –

+0

@Martin您必须将其添加到您当前的视图中,使用'addSubView:' – bdares

+0

我已经添加了'setFrame'和'addSubview',以便您有完整的画面 – apouche

5

添加在UIAleartView活动指标会有所帮助。 结帐这个...

UIAlertView *waitAlert = [[[UIAlertView alloc] initWithTitle:@"Please Wait...." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 

[waitAlert show]; 

UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 

// Adjust the indicator so it is up a few pixels from the bottom of the alert 
indicator.center = CGPointMake(waitAlert.bounds.size.width/2, waitAlert.bounds.size.height - 50); 
[indicator startAnimating]; 
[waitAlert addSubview:indicator]; 
[indicator release]; 

编辑: 可能就是你的应用程序被阻塞的原因是这种方法

sendSynchronousRequest:(NSURLRequest *)request

以下是该方法的描述。

的同步负荷是建立在由类提供异步加载代码的顶部。调用线程在异步加载系统对专门为此加载请求生成的线程执行URL加载时被阻塞。为了执行同步加载,在调用线程中不需要特殊的线程或运行循环配置。

如果你不想让你的应用程序阻止再从其他线程调用此。请阅读以下内容。

重要提示:由于此调用有可能需要几分钟失败(使用iOS的蜂窝网络特别是当),你永远不应该叫从GUI应用程序的主线程此功能。

请参考NSURLConnection的等级参考。上述两个块均取自该块。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

+0

使用未声明的标识符'waitAlert'? –

+0

在你的代码中声明UIAleartView * waitAlert你只是没有我正在使用的变量。所以在代码中声明它们。 – Mohammad

+0

that worked,tahnks,但冻结的问题没有解决=( –

1

创建:

spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
[spinner setCenter:CGPointMake(kScreenWidth/2.0, kScreenHeight/2.0)]; // I do this because I'm in landscape mode 
[self.view addSubview:spinner]; // spinner is not visible until started 

开始:

[spinner startAnimating]; 

停止:

[spinner stopAnimating]; 

当你最终完成时,从视图中删除微调并释放。

4

对于synchroneous使用:(不好的形式,但工作解决方案)

//Right before the request is made 
UIActivityIndicatorView* indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[indicatorView setFrame:CGRectMake(0, 0, 16, 16)]; 
[indicatorView setHidesWhenStopped:YES]; 
[indicatorView startAnimating]; 
[self.view addSubview:indicatorView]; 
// Create your request (synchronously or asynchronously) 
[self performSelector:@selector(myDoRequest:) withObject:self afterDelay:0.1]; 
//this gives time for the runloop to complete at least one screen draw.. 
... 

-(void)myDoRequest:(id)sender { 
    // Create your request (synchronously or asynchronously) 
    ... 
    // When request is done 
    [indicatorView stopAnimating]; 
    [indicatorView release]; 
} 
+0

也使用未声明的标识符。 myDoRequest当我把它变成IBAction为 –

相关问题