1

json ベースの Web サービスへの http 呼び出しを行うコードがいくつかあります。それは正常に機能していますが、コードを独自のクラスに移動しようとしましたが、少しハングアップしました。メソッドを呼び出すと、メイン スレッドはメソッドからの応答を待たずに次のコマンドに進みます。

プログラムの主要部分のコードを次に示します。

[newcall run];
    NSLog(@"%@",[newcall status]);
    NSArray *resultarray= [newcall returndata];
    for (NSString *element in resultarray) {
        NSLog(@"%@",element);
}

私のヘッダー

#import "AFHTTPClient.h"

@interface jsoncall : AFHTTPClient
{
    NSString* Date;
    NSString* apps;
    NSString* data1;
    NSURL* url;
    NSString* Path;
    NSArray* returndata;
    NSString* status;
}

-(void) setApp: (NSString *)input;

-(void) setData: (NSString *)input;

-(void) setURL: (NSString *)input;

-(void) setPath: (NSString *)input;

-(int) run;

-(NSArray *) returndata;
-(NSString *) status;

@end

私の実行方法

-(int) run
{
    __block int success;
    NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"];
    NSString* jsonString = [jsonDictionary JSONRepresentation];
    AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url];
    NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
                           apps,@"app",
                           jsonString,@"smpdata",nil];
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                        NSArray *dataarray=[JSON valueForKey:@"Data"];
                        status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
                        NSLog(@"%@",status);
                        returndata= dataarray;
                        success=1;
                        NSLog(@"Success: Made it here");
                    }
                    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error,id JSON)
                    {
                        success=0;
                        NSLog(@"Error: Made it here");
                    }
    ];

    [operation start];
    [operation waitUntilFinished];
    return success;
}
4

1 に答える 1

-1

私が使用した方法は非同期であったため、次の一連の処理を完了ブロックから呼び出して連鎖させる必要がありました。最終的なアプリが完成したら、それを行うかもしれませんが、この解決策もあります。

AFNetworking リクエストで完了ブロックが完了するのを待っています

AFJSONRequestOperation を NSURLConnection に切り替えることで、同期モードを使用できます。これは、スレッドが移動する前に要求を完了する必要があることを意味します。

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];

NSURLResponse *response = nil;
NSError *error = nil;

NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if (error) {
    NSLog(@"Error: %@",error);
}
else {
    id JSON = AFJSONDecode(data, &error);
    NSArray *dataarray=[JSON valueForKey:@"Data"];
    status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
    NSLog(@"%@",status);
    returndata= dataarray;

}

私たちのニーズでは、同期モードは今のところ問題なく動作するはずです。

でも

UI スレッドで同期 Web 呼び出しを実行しないでください。ブロックされて UI が応答しなくなるためです。つまり、このクラスへの呼び出しを、それに依存する他のコードと一緒に独自のスレッドに配置する必要があります。NSOperation の使用方法を確認したいと思われますが、私は Objective-C 初心者なので、ここでは例を追加しません。

于 2012-09-07T21:30:50.743 に答える