当我在xcode调试模式下研究这个方法时,在构造请求时会发生一些奇怪的事情。
urlString
。例如,if SessionId = "abc"
,然后在执行从NSURLRequest *request...
开始的行之后,调试器显示SessionUrlString = "...session/abc\x03" instead of simply "...session/abc"
。尽管调试器仍然显示SessionId = "abc"
。这是为什么?请求对象似乎不包含url
在任何地方,即使它的构造函数只是将url
作为变量。它去了哪里?它是存储在AFHTTPCLient
对象中的某个请求对象中吗?
-(NSObject*)makeRequestForSessionUsingId: (NSString *)SessionId{
NSString *baseSessionURLString = [kCwAPIBaseURLString stringByAppendingString:@"session/"];
NSString *SessionURLString = [baseSessionURLString stringByAppendingString:SessionId];
NSURL *url = [NSURL URLWithString:SessionURLString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
__block NSObject *sessionJSON = [[NSObject alloc] init];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);
sessionJSON = JSON;
} failure:nil];
[operation start];
return sessionJSON;
}
答案 0 :(得分:0)
我不确定是什么导致了URL字符串中的尾随字符,但是如果你可以在NSLog语句中输出它并且它正确显示它可能是正确的。
NSURLRequest
将您创建的网址存储在- URL
属性中,您可以在the documentation中看到该属性。这意味着您应该可以使用以下内容:
NSLog(@"Request URL: %@", [request URL]);
查看网址。
我在这里看到的更大问题是你的回归模式。如果此AFJSONRequestOperation
花费任何时间,则返回的值将为空sessionJSON
变量。当您运行[operation start];
时,默认情况下,操作不会在返回您指定的值之前等待完成。有一种方法可以让它等待,但你永远不想阻止等待网络请求的任何线程可能需要比你希望的更长的时间。你可以在这里做一些其他的选择,但主要是你必须以不同的方式思考它。您想要对网络请求的响应做的所有事情都需要在成功和失败块中完成。此方法不应尝试返回值(除非它以另一个块的形式)。有些方法可以做到这一点:
@property
中。执行此操作后,调用方法[self foo];
,然后使用存储的响应执行您想要的操作。[self foo:JSON]