2012-05-04 9 views
0

WebCallsというオブジェクトクラスが設定されています。このクラスでは、Web呼び出しを行い、HTTPSサーバーからJSONを返します。今、メソッドは完全に動作し、私はテストし、データは正常に返されます。しかし、私の問題は、私はクラスの外に返されたデータにアクセスすることができないということです。私はjsonDataと呼ばれる文字列を持つインターフェイスクラスのインターフェイスHTTPSデータが保存されませんでした

@interface WebCall : NSObject{ 

    NSString *phoneNumber; 
    NSString *jsonData; 
} 
@property (nonatomic, retain) NSMutableData *responseData; 
@property (nonatomic, retain) NSString *jsonData; 


-(void) getData: (NSString *) link; 


@end 

Implementation 

@implementation WebCall 

@synthesize jsonData; 
@synthesize responseData; 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
} 

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 

    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 

    [responseData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    self.responseData = nil; 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

     NSString *s = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    jsonData = s; 

} 

-(void) getData: (NSString *) link{ 

     jsonData = [[NSString alloc] init]; 
self.responseData = [NSMutableData data]; 
    NSURL * url = [NSURL URLWithString:link]; 
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; 
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPMethod:@"GET"]; 
    [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES]; 

} 



@end 

下のデータを取得するための

コードがあります。私は取得し、プロパティと合成を使用して設定します。私は、Web呼び出しを行った後だから、私はjsonDataにデータを割り当てる、と私は、ウェブコールクラスをインポートGETINFOメソッドを使用することができるはず、jsonDataが戻ってきた後、

WebCall *wc = [[WebCall alloc] init]; 
[wc getData:url]; 
NSLog(@"%@", [c jsonData]); 

しかし、これだけでプリント使用してアクセスアウトヌル。それでも、データを受け取った後にWebcallクラスのStringを出力すると、問題なく印刷されます。誰かが私が間違っていることを教えてもらえますか?事前に

おかげ

編集:私は法の外の文字列にアクセスすることはできません。また完全な実装で

を更新しました。コードを別のクラスにコピーして、JSON Stringを割り当ててから本体で再度呼び出すと、nullが再び出てきます。私はその接続方法でしか印刷することができないようです。そして、それは文字列に

編集をクリアするようだ:私が試した何

[wc setWebCallDidFinish:^(NSString * json, NSString *test){ 

    NSLog(@"%@", json); 


}]; 
[wc getData:@"12345"]; 
+0

WebCall –

+0

の完全な実装方法を教えてください。なぜこのようにしているのですか?これは本当にイライラしていて、文字通りなぜこれをやっているのか分からない – AdamM

+0

cの第2のコードセットでは何ですか? –

答えて

1

アダムjsonDataが空の文字列である理由は、[[NSURLConnectionのはalloc] initWithRequest:リクエストのデリゲート:自己startImmediately:YES];非同期に実行されます。つまり、新しいスレッドではブロックされません。これは、[wc getData:url]を呼び出したときにそのことを意味します。直ちにNSLog(@ "%@"、[wc jsonData])を呼び出します。 http要求はまだ完了せず、WebCallで - (void)connectionDidFinishLoading:(NSURLConnection *)接続代理関数がまだ呼び出されていません。

詳しい説明はiOs Concurrency Programming Guideをお読みください。基本的には、WebCallに通知機能を追加する必要があります。この機能を使用すると、リクエストが完了したオブジェクトをオブジェクトに通知できるようになります。私はそのようなブロックを使用します。

 

@interface WebCall : NSObject{ 

    NSString *phoneNumber; 
    NSString *jsonData; 
    void(^webCallDidFinish)(NSString *jsonData, id otherRandomVar); 
} 
@property (nonatomic, retain) NSMutableData *responseData; 
@property (nonatomic, retain) NSString *jsonData; 


-(void) getData: (NSString *) link; 
-(void)setWebCallDidFinish:(void (^)(NSString *, id))wcdf; 

@end 

Implementation 

@implementation WebCall 

@synthesize jsonData; 
@synthesize responseData; 

-(void)setWebCallDidFinish:(void (^)(NSString *,id))wcdf{ 
    webCallDidFinish = [wcdf copy]; 
} 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

     NSString *s = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    jsonData = s; 
    webCallDidFinish(jsonData, @"any other object"); 

} 
//all of your other code here 
 

そして、呼び出し元のコードに何が起こるだろうことはjsonDataがロードされた後に呼び出されます、あなたがsetWebCallDidFinishに提供したコードのブロックである

 

WebCall *wc = [[WebCall alloc] init]; 
[wc setWebCallDidFinish:^(NSString * json, id randomSecondVar) { 
    NSLog(@"%@",json); 
}]; 
[wc getData:url]; 
 

を以下に示します。デリゲートパターンを使用してこれを実行することもできます。この非同期要求がロードされている間、ユーザーに何らかの種類のインジケーターを提供する必要があることに注意してください。

+0

ありがとうsoo多く!それは完璧に働いた、私はこの電子機器を実現したと思う、それを働かせようと時間を費やした。あなたは大きな時間を過ごす! – AdamM

+0

@AdamM私は助けてくれることを嬉しく思います。 –

+0

簡単な質問ですが、複数の変数を返すにはどうすればよいでしょうか。全プロセスは、jsonにアクセスする前に認証を受けるために必要ないくつかのリンクです。この部分は正常に動作しますが、復帰するために必要な変数が2つあります。私に示した方法で複数の変数を返すことはできますか? – AdamM

関連する問題