1

当我在 xcode 调试模式下研究这个方法时,在构造请求时会发生一些奇怪的事情。

  1. 额外的字符被添加到urlString. 例如if SessionId = "abc",然后在执行从 开始的行之后NSURLRequest *request...,调试器会显示SessionUrlString = "...session/abc\x03" instead of simply "...session/abc". 尽管调试器仍然显示SessionId = "abc". 为什么是这样?
  2. 请求对象似乎不包含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;
    }
    
4

1 回答 1

0

我不确定是什么导致了 URL 字符串中的尾随字符,但如果你可以在 NSLog 语句中输出它并且它正确显示,那么它可能是正确的。

NSURLRequest将您创建它的 URL 存储在它的- URL属性中,您可以在文档中看到。这意味着您应该能够使用类似的东西:

NSLog(@"Request URL: %@", [request URL]);

要查看网址。

我在这里看到的更大的问题是你的回报模式。如果这AFJSONRequestOperation需要任何时间,则返回的值将是一个空sessionJSON变量。当您运行[operation start];该操作时,默认情况下不会在返回您指定的值之前等待完成。有一种方法可以让它等待,但你永远不想阻止任何等待网络请求的线程,这可能需要比你希望的更长的时间。你可以在这里做一些其他的选择,但主要是你必须以不同的方式考虑它。几乎所有你想要对网络请求的响应做的事情都需要在成功和失败块中完成。此方法不应尝试返回值(除非它是另一个块的形式)。一些方法可以做到这一点:

  1. 将响应 JSON 存储@property在您的类中。之后调用一个方法[self foo];,然后使用存储的响应来做你想做的事。
  2. 在块中调用传递响应 json 的方法[self foo:JSON]
  3. 将响应作为对象发布NSNotification 。
  4. 将一个块传递给此方法,然后调用该方法将响应传递回原始调用者。
于 2013-03-25T11:40:03.600 回答