0

Oauth を実装した Web サービス API との通信を開始しました。OauthConsumer を実装し、GET メソッドによるデータの構築と取得を開始しました。XML本体でPOSTメソッドを試みるまで、すべてうまくいきました。
最初は、問題の解決に少し近づくのに役立ついくつかのナゲットを発見するまで、間違ったツリーを吠え始めました

  • Content-Type を設定する必要がありました
  • setHTTPBody メソッドを設定する前にリクエストを準備する必要がありました

    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
                       consumer:consumer
                          token:accessToken
                          realm:nil
              signatureProvider:nil];
    
    
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
    [request prepare];
    
    [request setHTTPBody:[xml dataUsingEncoding:NSUTF8StringEncoding]];
    
    OADataFetcher *fetcher = [[OADataFetcher alloc] init];
    
    [fetcher fetchDataWithRequest:request
                     delegate:self
            didFinishSelector:@selector(apiTicket:didPostInvoice:)
              didFailSelector:@selector(apiTicket:didFailPostInvoice:)];
    

その後、fetchDataWithRequest を呼び出すと NSRangeException が発生し始めました。

これを止める方法は?

4

1 に答える 1

0

結局のところ、問題はメソッドのfetchDataWithRequest呼び出しでprepareあり、これにより、データのフェッチに至るまでのすべての適切な作業が元に戻されます。解決策は、準備が再度呼び出されないように fetchDataWithPreparedRequest メソッドを作成することでした

@implementation OADataFetcher
...

- (void)fetchDataWithPreparedRequest:(OAMutableURLRequest *)aRequest delegate:(id)aDelegate didFinishSelector:(SEL)finishSelector didFailSelector:(SEL)failSelector {
        [request release];
        request = [aRequest retain];
        delegate = aDelegate;
        didFinishSelector = finishSelector;
        didFailSelector = failSelector;

//      [request prepare];

        connection = [[NSURLConnection alloc] initWithRequest:aRequest delegate:self];
}

@end
于 2013-05-27T04:34:48.740 に答える