NSOperationQueue addOperationWithBlock在iOS中返回

时间:2013-07-31 09:06:58

标签: objective-c nsoperation nsoperationqueue

我写了方法 - (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 @"";
}

但是现在我收到一个空字符串@“”,我无法收到来自服务器的响应。有没有办法做同样的任务..

1 个答案:

答案 0 :(得分:0)

您是否注意到这种方法应该有一些变化来完成任务?由于异步方法的本质,你很难以这种方式使用getter。或者getter将轮流阻止主线程。

为避免这种情况,我建议您在后台线程中完成服务器请求后使用NSNotification更新UI;

或更改你的getter方法定义,将结果从后台线程传递给主线程,但是异步:

- (void)getStatusAsychronously:(NSString *)statusUrl withCompletionBlock:(void(^)(NSString *result))completionBlock;

甚至考虑为服务器请求子类化NSOperation对象。 NSOperation子类对于NSOperationQueue个实例非常方便,可以提供一些更有用的功能,例如取消操作。