2016-04-24 52 views
0

尋找這種類型的錯誤後:如何訪問Objective-C中id類型塊內的變量?

Variable is not assignable (missing __block type specifier)

我發現下面的解決方案Assign a variable inside a Block to a variable outside a Block後,我讀到有關__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打印什麼

我想是給定的結果值中的extern外塊變量。

enter image description here

+0

你的完成處理程序,完成? –

+0

我的完成處理程序已完成 –

+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; 
}]; 
+0

你能提供詳細的答案嗎? –

+0

我試過你的解決方案同樣的問題持續存在 –

0

添加以下您塊:

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

然後運行代碼。

您的問題的答案將是顯而易見的。

HTH

+0

我不明白你想說什麼 –

+0

當你運行你的代碼時,兩個日誌語句按什麼順序打印? – CRD

+0

塊之外的塊運行之前塊內我知道,但我想要一個解決方案 –

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

是已經在https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW6但如何瞭解這個我可以解決我的問題 –

+0

查看我更新的代碼片段。 –

+0

塊裏面的日誌給我的結果,但我想 –

0

你有一個局部變量strongUser,這意味着,當此範圍內(功能)將完成,局部變量strongUser將被釋放 - 所以當你的塊的工作__block variavle用戶是活的,但它指向歷克西斯特目的。

易於WASY實現它的權利是創建一個屬性與懶惰的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); 
    }]; 

希望它能幫助!

+0

同樣的問題仍然存在:S –

+0

@ZakariaDarwish你不會得到結果的值在NSLog的最後一行,因爲它的工作原理早於結束塊。結果的值將在完成後設置在強用戶中。 –

+0

你能告訴我如何知道何時完成完成 –