搜索此类错误后:
变量不可分配(缺少__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
什么都不打印
我想要的是将结果值赋予块外的外部变量。
答案 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);
}];
希望它有所帮助!