0

我是objective -c的新手,并且仍在尝试解决这个问题。说我有这样的事情:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[CustomAPIClient sharedClient] getPath:@"/api/feed" parameters:[NSDictionary dictionary] success:^(AFHTTPRequestOperation *operation, id responseObject) {

    }];

    **//Now, how do I get my responseObject out here??**
}

我可能会以错误的方式解决这个问题,但基本上,我有一个控制器可以显示某个视图。我还会有另一个这样的控制器:

- (void)viewDidLoad
    {
        [super viewDidLoad];
        [[CustomAPIClient sharedClient] getPath:@"/api/profile" parameters:[NSDictionary dictionary] success:^(AFHTTPRequestOperation *operation, id responseObject) {

        }];

        **//Now, how do I get my responseObject out here??**
    }

所以我的问题是:

  1. 如何在该块之外获取 responseObject?
  2. 有没有办法让我在不调用[[CustomAPIClient...块的情况下保持身份验证?

提前谢谢各位。


为了更好地解释我在做什么。我有表格视图单元格:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.meResponseObjectFromAboveCode count];
}

所以我想在我的响应对象中有什么,显示在我的表格视图中

4

1 回答 1

0

块是执行单元。在这种情况下,你给这个方法一个块,一旦请求成功返回,它就可以执行。所以,首先,你给网络客户端一些代码并说“我希望它在你完成时执行,现在也是。” 如果,理论上,有可能有responseObject“在这里”,它会是 nil (或者至少不是你想要的),因为在getPath执行该方法之后,它存储要稍后(很久以后)执行的块,然后在该方法之后继续执行代码,基本上是在您发出网络请求之后立即执行,没有时间实际发出请求,返回并使其responseObject可用。

其次,块是闭包。意思是,它捕获了它自己范围之外的变量,但是传递给它或在其中初始化的任何东西都被“封闭”在其中,并且在它之外是不可见的。

现在,为了清楚地说明这一点,您可以getPath通过在调用like之前声明一个变量来解决这个问题__block id veryBadIdea;,然后(由于__block修饰符)您可以在块内更改它。所以,在这个坏主意的例子中,你会做veryBadIdea = responseObject,然后getPath你可以做NSLog(@"%@", veryBadIdea);,然后看到它是零。为什么?因为在调用 NSLog 时,网络请求可能还没有发送。当veryBadIdea 被赋值时, 的值responseObject早已viewDidLoad完成并返回。

因此,responseObject在块内使用,因为它是可用的,这就是您希望使用它的任何代码运行的地方(和时间)。

于 2013-09-05T17:57:40.200 回答