尝试从完成处理程序中的响应对象返回字符串[重复]

Posted

技术标签:

【中文标题】尝试从完成处理程序中的响应对象返回字符串[重复]【英文标题】:Trying to return a string from a response object inside a completion handler [duplicate] 【发布时间】:2014-10-23 10:15:34 【问题描述】:
+ (NSString *) simpleAuth 

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


];

return accessToken

尝试将我的 instagram 访问令牌作为字符串获取,以便我可以使用它在我的 swift viewcontroller 文件中下载数据。我不得不在 Objective C 中编写简单的身份验证,因为它不适用于 swift atm。

【问题讨论】:

你不能这样做,你必须通知你的控制器你终于得到了令牌。使用通知或委托 【参考方案1】:

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

这样的方法会更好,

+ (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);
];

【讨论】:

【参考方案2】:

无法从响应块中“返回”对象。这是因为响应块是异步运行的,因此您的代码会在 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];

【讨论】:

谢谢,我都试过了,但遇到了麻烦......最终通过 NSUserdefaults 存储,然后我可以在我的 swift 文件中访问它。 很高兴听到您找到了解决方案。

以上是关于尝试从完成处理程序中的响应对象返回字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 要求在完成处理程序中的返回值名称之前放置 _ [重复]

python web开发-flask中responsecookiessession对象使用详解

如何调用包含完成处理程序的函数?

如何等待http请求在处理到angular 7中的下一步之前获得响应[重复]

Object.keys() 从集合中返回 MongoDB 对象上的意外键 [重复]

Servlet中文乱码解决方法