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 をこのように使用することはほとんどできません。または、ゲッターが順番にメインスレッドをブロックします。

これを回避するにNSNotificationは、バックグラウンド スレッドでサーバー リクエストを完了した後に UI を更新することをお勧めします。

または、getter メソッドの定義を変更して、結果をバックグラウンド スレッドからメイン スレッドに渡すようにしますが、非同期で行います。

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

NSOperationまたは、サーバー要求のオブジェクトをサブクラス化することも検討してください。NSOperationサブクラスはインスタンスで非常に便利で、NSOperationQueue操作のキャンセルなど、さらに便利な機能を提供できます。

于 2013-09-11T11:51:11.807 に答える