【问题标题】:NSOperationQueue addOperationWithBlock with return in iOSNSOperationQueue addOperationWithBlock 在 iOS 中返回
【发布时间】:2013-07-31 09:06:58
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c nsoperation nsoperationqueue


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多