我写了方法 - (void)getStatus:(NSString *)url ,返回类型,
-(NSString) getStatus:(NSString*) statusUrl
{
NSURL *urlObj = [NSURL URLWithString:[statusUrl
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSError *err;
NSString *response = [NSString stringWithContentsOfURL: urlObj encoding:
NSUTF8StringEncoding error:&err];
return response;
}
但是 stringWithContentsOfURL 正在主线程中执行操作,因此在调用此方法时,应用程序会被触发一秒钟。
所以我需要在后台线程中执行 stringWithContentsOfURL 函数,在得到响应之后我想返回响应。
我目前的代码:
-(NSString) getStatus:(NSString*) statusUrl
{
NSURL *urlObj = [NSURL URLWithString:[statusUrl
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSError *err;
NSOperationQueue *rbQueue = [[[NSOperationQueue alloc] init] autorelease];
[rbQueue addOperationWithBlock:^{
NSString *response = [NSString stringWithContentsOfURL: urlObj
encoding: NSUTF8StringEncoding error:&err];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
return response;
}];
}];
return @"";
}
但是现在我收到一个空字符串@“”,我无法收到来自服务器的响应。有没有办法做同样的任务..
答案 0 :(得分:0)
您是否注意到这种方法应该有一些变化来完成任务?由于异步方法的本质,你很难以这种方式使用getter。或者getter将轮流阻止主线程。
为避免这种情况,我建议您在后台线程中完成服务器请求后使用NSNotification
更新UI;
或更改你的getter方法定义,将结果从后台线程传递给主线程,但是异步:
- (void)getStatusAsychronously:(NSString *)statusUrl withCompletionBlock:(void(^)(NSString *result))completionBlock;
甚至考虑为服务器请求子类化NSOperation
对象。 NSOperation
子类对于NSOperationQueue
个实例非常方便,可以提供一些更有用的功能,例如取消操作。