0

我已经编写了带有返回类型的方法-(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 @"";
}

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

4

1 回答 1

0

您是否注意到这种方法应该进行一些更改才能完成任务?由于异步方法的性质,您几乎不能以这种方式使用 getter。或者 getter 会依次阻塞主线程。

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

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

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

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

于 2013-09-11T11:51:11.807 回答