1

次のコードを使用して、文字列クエリからの応答を取得しています。私のアプリにはたくさんのクエリがあり、このコードを何度もコピーして貼り付けたいです

インスタンスを作成し、urlStringを渡して、応答を返す方法はありますか。

NSObjectクラスで関数を作成しようとしました +(NSString*) myFunc{}が、メインUIスレッド以外ではGCDが機能しないようです。この問題を解決するにはどうすればよいですか

__block__  NSString *response;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    //your server url and request. data comes back in this background thread
    response; = [NSString stringWithContentsOfURL:[NSURL URLWithString:queryString] encoding:NSUTF8StringEncoding error:&err];

    dispatch_async(dispatch_get_main_queue(), ^{
        //update main thread here.
        NSLog(@"%@",response); // NEED TO RETURN THIS

        if (err != nil)
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Error"
                                                           message: @"An error has occurred."
                                                          delegate: self
                                                 cancelButtonTitle:@"Ok"
                                                 otherButtonTitles:nil];
            [alert show];
            [indicator stopAnimating];
        }
    });
});
4

1 に答える 1

1

完了ブロックを使用して呼び出し元にフィードバックを提供し、要求処理とエラー報告を分離します。

まず、完了ブロックのセマンティクスを定義します。文字列応答とオプションのエラー記述子が必要であることがわかっています。

typedef void (^COMPLETION_BLOCK)(NSString *response, NSString *error);

次に、バックグラウンドで応答を取得するメソッドを実装してから、メインスレッドで完了ブロックを呼び出します。必要に応じて、これは一部のグローバルユーティリティクラスのクラスメソッドになります。

- (void)responseFromURL:(NSURL *)url
        completionBlock:(COMPLETION_BLOCK)completionBlock
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSError *error = nil;
        NSString *response = [NSString stringWithContentsOfURL:url
                                                      encoding:NSUTF8StringEncoding
                                                         error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            completionBlock(response, error);
        }
    }
}

そして最後にメソッドを呼び出します:

[someClass responseFromURL:[NSURL URLWithString:queryString]
           completionBlock:^(NSString *response, NSError *error) {

    NSLog(@"response='%@'", response);

    if (error != nil)
    {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error getting response"
                                                       message:[error localizedDescription]
                                                      delegate:self
                                             cancelButtonTitle:@"Ok"
                                             otherButtonTitles:nil];
        [alert show];
        [indicator stopAnimating];
    }
}];

(このコードはテストされていないため、間違いなくいくつかのバグが含まれています)

于 2013-02-05T10:14:31.280 に答える