2013-03-25 23 views
1

當我在xcode調試模式下調查此方法時,構建請求時會發生一些奇怪的事情。
使用requestWithURL形成請求時,url更改也丟失

  1. 額外字符被添加到urlString。例如,如果SessionId =「abc」,那麼在執行從NSURLRequest * request ...開始的行之後,調試器顯示SessionUrlString =「... session/abc \ x03」而不是簡單地「... session/abc 」。儘管調試器仍然顯示SessionId =「abc」。爲什麼是這樣?
  2. 儘管其構造函數只是將該url作爲變量,但請求對象在任何地方都不會包含網址 。它去了哪裏?它是否存儲在AFHTTPCLient對象某處的請求對象中?

    - (NSObject的*)makeRequestForSessionUsingId:(的NSString *)的SessionID {

    的NSString * baseSessionURLString = [kCwAPIBaseURLString stringByAppendingString:@ 「會話/」]; NSString * SessionURLString = [baseSessionURLString stringByAppendingString:SessionId];

    NSURL * url = [NSURL URLWithString:SessionURLString]; NSURLRequest * request = [NSURLRequest requestWithURL:url]; __block NSObject * sessionJSON = [[NSObject alloc] init];

    AFJSONRequestOperation *操作= [AFJSONRequestOperation JSONRequestOperationWithRequest:請求成功:^(的NSURLRequest *請求,NSHTTPURLResponse *響應,ID JSON){ 的NSLog(@ 「IP地址:%@」,[JSON valueForKeyPath:@ 「原點」] ); sessionJSON = JSON; }失敗:無];

    [操作開始]; return sessionJSON; }

回答

0

我不知道是什麼導致的末尾加在你的URL字符串,但如果你能在一個聲明中的NSLog輸出它,它顯示了正確的,它可能是正確的。

NSURLRequest商店,你在它的- URL屬性,你可以在the documentation看到創建它的URL。這意味着你應該能夠使用類似:

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

要看到的網址。

我在這裏看到的更大的問題是您的返回模式。如果此AFJSONRequestOperation需要任何時間量,則返回的值將是空的sessionJSON變量。當您運行[operation start];時,默認情況下,操作不會在返回指定的值之前等待完成。有一種方法可以讓它等待,但你永遠不想阻止任何等待網絡請求的線程,這可能需要比你希望的時間更長的時間。你可以在這裏做其他選擇,但主要是你必須以不同的方式思考它。幾乎所有你想做的事情都需要在成功和失敗塊中完成來自網絡請求的響應。此方法不應該嘗試並返回一個值(除非它以另一個塊的形式)。有些方法可以做到這一點:

  1. 將響應JSON存儲在您班上的@property中。這樣做後,調用方法[self foo];,然後使用存儲的響應做你想做的。
  2. 在塊調用中傳遞響應的方法json [self foo:JSON]
  3. 發佈NSNotification,並將響應作爲對象。
  4. 將此塊傳遞給此方法,然後您調用該方法將響應傳遞迴原始調用方。