【问题标题】:Use the variable after block successful completion块成功完成后使用变量
【发布时间】:2015-03-24 19:12:08
【问题描述】:

我现在正在做一个简单的 instagram 项目。 有好几次我都遇到了同样的问题。 为了与 instagram 合作,我使用 InstagramKit Engine。它有一些预设(空白)让生活更轻松。但是我总是遇到同样的问题。

假设我们有这个:

- (void)getSelfUserDetails
{
    [[InstagramEngine sharedEngine] getSelfUserDetailsWithSuccess:^(InstagramUser *userDetail) {

        NSLog(@"%@",userDetail);

    } failure:^(NSError *error) {
   }];
}

这里 userDetail 用于“成功”内部。而且效果很好。我需要的是在块完成后以某种方式保存它。

我已经尝试了几件事,从创建一个存储 userDetails 的属性到创建我自己的方法来返回 userDetails。保存整数、NSStrings 等也有同样的麻烦。

我想我错过了一些简单的出路。

请给我看。

【问题讨论】:

  • 如果您描述了尝试使用 userDetail 值时遇到的问题,这将有所帮助。请记住,“成功”块是异步调用的,因此您可能没有考虑到这一点。
  • 我昨天想到了“成功”的异步尝试获取用户的状态(已关注/已关注)。它存储在 NSDictionary 中。每次我尝试将整个字典保存在“成功”中,然后在整个函数之后 NSLog 它,我得到(null)。据我了解,程序继续运行,并且 NSLog 行在收到 Dictionary 前几毫秒执行。我设法通过在“成功”中做我需要的一切来四处走动,但我感觉很糟糕,因为这种方法显然没有成效。我觉得应该有一些更简单的解决方案。
  • 空白是什么?你说的是块。
  • 是的,我的错。我专注于(void),错过了[...]的东西=\纠正了这个问题。谢谢。
  • 您在保存时遇到了什么麻烦?

标签: objective-c objective-c-blocks instagram


【解决方案1】:

您需要在块中捕获一个可以发送响应对象的对象。
这可以是自我。

-(void)processUserDetails:(InstagramUser *) userDetail
{
    //....
}

- (void)getSelfUserDetails
{
    [[InstagramEngine sharedEngine] getSelfUserDetailsWithSuccess:^(InstagramUser *userDetail) {
        [self processUserDetails: userDetail];
    } failure:^(NSError *error) {
   }];
}

【讨论】:

  • 我明白了。刚刚试过。 s 我明白,如果我 NSLog 在 [self getSelfUserDetails] 之后收到的变量,我不会得到结果;主函数。我需要做的所有事情都必须在“processUserDetails”空白中做。对吗?
  • 我的意思是我正在执行的函数 [self getSelfUserDetails];在。
  • 为什么还要void?这些是方法。此外,调用方法(您的主方法)很可能会在块执行之前完成。
  • 关于“void” - 不确定它的英文单词,所以只用括号中的单词命名。该块较慢,但我想我可以这样使用它。感谢您的回答。
  • 如果 self 没有对 Instagram 引擎的引用,这将如何产生一个保留周期?
【解决方案2】:

您可以创建一个属性来保存您找到的 Instagram 用户并将其分配给成功块:

 @property (nonatomic) InstagramUser *myUser;


- (void)getSelfUserDetails
{
    [[InstagramEngine sharedEngine] getSelfUserDetailsWithSuccess:^(InstagramUser *userDetail) {

        NSLog(@"%@",userDetail);
        self.myUser = userDetail;
    } failure:^(NSError *error) {
   }];
}

【讨论】:

    【解决方案3】:

    这对 NSNotification 很有用(因为上面的调用是异步发生的)。

    你可以这样称呼它:

       [[NSNotificationCenter defaultCenter] 
            postNotificationName:@"TestNotification" 
            object:self
            userInfo:@{ @"userDetail" : userDetail }
       ];
    

    然后使用正在侦听该事件的任何方法取回该 userInfo 数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      相关资源
      最近更新 更多