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 回答