2016-05-21 9 views
0

Instagram APIのヘルパークラスを実装しています。この状況でブロックを管理する方法

私は、アクセスコードを取得する方法があります:

-(void) makeAuthenticateRequestWithBlock: (completionBlock) block { 
    if (![self.viewController.view.subviews containsObject: self.webView]) { 
    [self.viewController.view addSubview: self.webView]; 
    } 
    if (!self.isUserAuthinticated && self.isAvailableAllRequredData) { 
    NSString * fullURL = [NSString stringWithFormat: @ "%@?client_id=%@&redirect_uri=%@&response_type=token&scope=likes+comments+basic+public_content+follower_list", KAUTHURL, self.clientId, self.redirectURL]; 
    NSURL * url = [NSURL URLWithString: fullURL]; 
    NSURLRequest * request = [NSURLRequest requestWithURL: url]; 
    [self.webView loadRequest: request]; 
    self.block = block; 
    } 
} 

typedef void(^completionBlock) (BOOL success);はブロックであり、私が持っている:WebViewのデリゲートメソッドで

@property (copy, nonatomic) completionBlock block;

を。

-(BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) request navigationType: (UIWebViewNavigationType) navigationType { 
    NSString * urlString = [ 
    [request URL] absoluteString 
    ]; 
    NSLog(@ "URL STRING : %@ ", urlString); 
    NSArray * UrlParts = [urlString componentsSeparatedByString: [NSString stringWithFormat: @ "%@/", self.redirectURL]]; 
    if ([UrlParts count] > 1) { 
    // do any of the following here 
    urlString = [UrlParts objectAtIndex: 1]; 
    NSRange accessToken = [urlString rangeOfString: @ "#access_token="]; 
    if (accessToken.location != NSNotFound) { 
     NSString * strAccessToken = [urlString substringFromIndex: NSMaxRange(accessToken)]; 
     NSLog(@ "access token = %@ ", strAccessToken); 
     [self.webView removeFromSuperview]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     [ 
     [NSUserDefaults standardUserDefaults] setValue: strAccessToken forKey: kAccessToken 
     ]; 
     [ 
     [NSUserDefaults standardUserDefaults] synchronize 
     ]; 
     self.isUserAuthinticated = true; 
     self.block(true); 
    } 
    return NO; 
    } 
    return YES; 
} 

すべて正常です。

私はInstagram APIにリクエストを送信すると、ユーザーが認証されているかどうかを確認します。

-(void) getInformationOfOwnWithCompletionBlock: (dataTaskBlock) block { 
    if (self.isUserAuthinticated) { 
    NSString * urlString = [NSString stringWithFormat: @ "%@self/?access_token=%@", kUSERURL, [ 
     [NSUserDefaults standardUserDefaults] valueForKey: kAccessToken 
    ]]; 
    [self makeRequestToServerWithUrl: urlString completionBlock:^(NSDictionary * data, NSError * error) { 
     if (!error) { 
     block(data, error); 
     } else { 
     block(nil, error); 
     } 
    }]; 
    } else { 
    [self makeAuthenticateRequestWithBlock:^(BOOL success) { 
     [self getinformationofOwnFollowsWithCompletionBlock: block]; 
    }]; 
    // block(nil,errorMsg); 
    } 
} 

返信ブロックでリクエストを送信し、ウェブビューを構築します。これはすべて正常に動作しています。それはself.blockためにある、

[self.instagramVC getInformationOfOwnWithCompletionBlock:^(NSDictionary * data, NSError * error) { 
    NSLog(@ "%@", data); 
}]; 
[self.instagramVC getInformationOfOwnWithCompletionBlock:^(NSDictionary * data, NSError * error) { 
    NSLog(@ "DATA 2%@", data); 
}];  

は、データ2.私はその理由を知っているだろう出力のような最後と呼ばれる方法のブロックを返します。私は2回同じメソッドを呼び出すときしかし、私は以下のエラーメッセージが表示されます。ですから、私は、それぞれの要求に対してグローバルブロックを使用する必要がないように提案してください。

+0

あなたのコードに従うのはかなり難しいですが、なぜブロックをプロパティに保存していますか?なぜそれを必要とする関数にパラメータとして渡すだけではないのですか? – Paulw11

+0

私は認証を要求するとき、要求をロードするためにwebviewにリクエストするので、リクエストを完了してそこから返す必要があります。 @ Paulw11 –

答えて

1

あなたの問題は、すべてのリクエストに対してグローバルブロックを使用していることです。保留中の各要求についての情報を保持するデータ構造を設定する必要があります。おそらく、各辞書に要求とその要求の補完ブロックが含まれている、辞書の可変配列。要求が完了したら、要求を要求の配列と照合し、適切な完了ブロックを実行します。

+0

あなたの答えをありがとう、しかし、私は配列のインデックスを管理することができます、私は要求が非同期であることを意味する方法は、ブロックのインデックスを特定することができますか?単純な例を与えることができます –

+0

これを処理する方法はたくさんあります。配列の各エントリに要求とブロックを保存できるはずです。要求が完了したら、配列内の要求を見つけて、対応するブロックを実行します。いいえ、私は便利な例はありません。 –

+0

URLをキーに辞書に補完ブロックを保存し、完了した要求のURLを使用して補完ブロックをルックアップすることもできます。 –

0

異なる要求に対して1つのグローバルブロックを使用します。このブロックをローカルスコープで作成すると、リクエストに独自の補完が得られます。

+0

あなたの答えはありがとう、私が言及したように、おそらく実行されるn個の要求があるので、各要求のためにグローバルオブジェクトを作ることは不可能であるので、それは良い考えではありません。 –

+0

1.プロパティcompletionBlockを削除します。 2. completionBlockをヒープにしたい場合は、copyを使用することができます。 – gerram

+0

私はプロパティを削除する場合、どのようにWebViewの代理人からブロックを返すことができますか? –

関連する問題