如何在Objective-C中访问id类型块内的变量?

时间:2016-04-24 19:38:40

标签: ios objective-c

搜索此类错误后:

  

变量不可分配(缺少__block类型说明符)

我找到了以下解决方案AutoValidate,在我阅读了Assign a variable inside a Block to a variable outside a Block之后,我无法从已接受的答案中受益,而且我的代码是不同的情况。

以下是我正在使用的代码:

NSDictionary *strongUser = [[NSDictionary alloc]init];
__block  NSDictionary *user = strongUser;

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
        user = result;
}];

NSLog(@"%@",user);

NSLog什么都不打印

我想要的是将结果值赋予块外的外部变量。

__block

4 个答案:

答案 0 :(得分:0)

我建议使用__block NSDictionary *strongUser。我担心指针user仍然存在于块内,但它所指向的基础变量可能无法再访问。例如:

__block NSDictionary *strongUser = [[NSDictionary alloc]init];

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
 {
     strongUser = result;
 }];

答案 1 :(得分:0)

在块中添加以下

NSLog(@"Doing assignment inside the block");

然后运行您的代码。

你的问题的答案显而易见。

HTH

答案 2 :(得分:0)

您运行代码异步,并且您的日志在完成处理程序之前进行评估 直接在完成处理程序的范围内添加您的日志。

NSDictionary *strongUser = [[NSDictionary alloc]init];
__block  NSDictionary *user = strongUser;

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters]
 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
 {
     user = result;

     NSLog(@"%@",user);
 }];

答案 3 :(得分:0)

你有一个局部变量strongUser,这意味着当这个范围(函数)完成时,你的局部变量strongUser将被释放 - 所以当你的块工作时__block变量用户是活着的但是它指向了不存在的对象。

实现它的简单方法是创建一个具有惰性setter的属性:

@property (nonatomic, strong) NSDictionary *strongUser;

- (NSDictionary *)strongUser {
    if (!_strongUser) {
        _strongUser = [[NSDictionary alloc] init];
    }
    return _strongUser;
}

用selfinside块调用它:

    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    [parameters setValue:@"id, name, email" forKey:@"fields"];

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me"parameters:parameters]
 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
     self.strongUser = result;  
     NSLog(@"%@",self.strongUser);  
     }];

希望它有所帮助!