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回同じメソッドを呼び出すときしかし、私は以下のエラーメッセージが表示されます。ですから、私は、それぞれの要求に対してグローバルブロックを使用する必要がないように提案してください。
あなたのコードに従うのはかなり難しいですが、なぜブロックをプロパティに保存していますか?なぜそれを必要とする関数にパラメータとして渡すだけではないのですか? – Paulw11
私は認証を要求するとき、要求をロードするためにwebviewにリクエストするので、リクエストを完了してそこから返す必要があります。 @ Paulw11 –