尝试从完成处理程序内的响应对象返回一个字符串

时间:2014-10-23 10:15:34

标签: ios objective-c methods instagram completionhandler

+ (NSString *) simpleAuth {

[SimpleAuth authorize:@"instagram" completion:^(NSDictionary *responseObject, NSError *error) {
    NSLog(@"plump: %@", responseObject);
    NSString *accessToken = responseObject[@"credentials"][@"token"];


}];

return accessToken

}

尝试将我的Instagram accessstoken作为字符串,以便我可以使用它在我的swift viewcontroller文件中下载数据。我不得不在Objective C中编写简单的auth,因为它不适用于swift atm。

2 个答案:

答案 0 :(得分:4)

由于该方法是异步运行的,因此您无法像这样返回访问令牌。我建议你在simpleAuth:方法中添加一个完成块,它在获得accessstoken时将访问令牌传递给被调用者。

这样的事情会更好,

+ (void)simpleAuth:(void(^)(NSString*))completionHandler
{
  [SimpleAuth authorize:@"instagram" completion:^(NSDictionary *responseObject, NSError *error)   {
    NSString *accessToken = responseObject[@"credentials"][@"token"];
    completionHandler(accessToken)
  }];
} 

你会这样称呼它,

[SomeClass simpleAuth:^(NSString *accessToken){
  NSLog(@"Received access token: %@", accessToken);
}];

答案 1 :(得分:0)

无法从响应块中“返回”对象。这是因为响应块运行异步,因此除了Auth调用之外,您的代码还会继续运行。

要解决此问题,您可以使用委托,或使用NSNotifications。 NSNotifications的例子是:

在听音控制器中添加如下内容:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(authCompleted:)
                                                 name:@"NotificationIdentifier"
                                               object:nil];

听力方法:

-(void)authCompleted:(NSNotification *)notification {
    NSString *accessToken = [notification object];
    //now continue your operations, like loading the profile, etc
}

在add的完成块中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationIdentifier" object: accessToken];