所以我希望我的应用程序在发送http请求并获得响应时不要锁定GUI,我尝试了,但它抱怨我在mainthread之外使用uikit,有人可以告诉我正确的分离方法http和gui?
-(void)parseCode:(NSString*)title{
UIActivityIndicatorView *spinner;
spinner.center = theDelegate.window.center;
spinner.tag = 12;
[theDelegate.window addSubview:spinner];
[spinner startAnimating];
dispatch_queue_t netQueue = dispatch_queue_create("com.david.netqueue", 0);
dispatch_async(netQueue, ^{
NSString *url =[NSString stringWithFormat:@"http://myWebService.org/"];
// Setup request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
NSString *contentType = [NSString stringWithFormat:@"application/x-www-form-urlencoded"];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
NSMutableString *data = [[NSMutableString alloc] init];
[data appendFormat:@"lang=%@", @"English"];
[data appendFormat:@"&code=%@", theDelegate.myView.text ];
[data appendFormat:@"&private=True" ];
[request setHTTPBody:[data dataUsingEncoding:NSUTF8StringEncoding]];
NSHTTPURLResponse *urlResponse = nil;
NSError *error = [[NSError alloc] init];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&urlResponse
error:&error];
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
[spinner stopAnimating];
[spinner removeFromSuperview];
[self presentResults:result];
});
});
}
答案 0 :(得分:1)
我对此并不了解,但你可以随时尝试,
[self performSelectorInBackground:@selector(parseCode:) withObject: title];
该方法导致函数在后台运行在一个单独的线程上,并且不需要花费太多精力来实现,我用它来做我喜欢的简单下载 [NSData dataWithContentsOfURL:url];但如果你做的更大,你可能需要做更多的工作。
如果你需要在类的外面调用方法,那么你将不得不在上面调用的类中创建一个方法然后调用选择器
答案 1 :(得分:1)
不使用NSURLConnection:sendSynchronousRequest
,而是使用NSURLConnection:initWithRequest:delegate:startImmediately:
,它以异步方式发送请求。使用NSURLConnection:connectionDidFinishLoading
委托方法来处理响应。
Apple在URL Loading System Programming Guide中提供了一个示例。
如果将startImmediately
设置为YES
,则将在与调用请求的运行循环相同的运行循环上调用委托方法。最有可能的是,这将是您的主要运行循环,因此您可以在委托方法中修改所需的UI,而无需担心线程问题。
答案 2 :(得分:1)
我认为问题不在于您的HTTP代码 - 而是在后台线程中访问UI。特别是这一行:
[data appendFormat:@"&code=%@", theDelegate.myView.text ];
您可能会在那里访问UITextView
或类似内容。您需要在后台线程之外执行此操作。将其移动到本地NSString
变量,然后您可以安全地从后台线程中访问该变量。