2013-10-09 78 views
0

我試圖訪問一個方法塊,但我不知道如何:如何訪問方法塊內的變量?

__block NSString *username; 
PFUser *user = [[self.messageData objectAtIndex:indexPath.row] objectForKey:@"author"]; 
[user fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error) { 
    username = [object objectForKey:@"username"]; 
    NSLog(@"%@", username); //returns "bob"; 
}]; 
NSLog(@"%@", username); //returns null 

如何從這個代碼訪問變量「用戶名」塊之外?

回答

6

其實你正在訪問塊外的變量username。由於該塊在另一個線程中運行,並且在塊執行完成後設置該值,因此您將獲得空值。所以,當程序塊運行時,你的最後一行已經在主線程中執行了,所以當最後一行被執行時,它的值沒有被設置。這就是爲什麼你得到空值。

+0

s Ayon是正確的..... – Spynet

+0

這是一個很好的答案!但不幸的是我即將在tableview中運行我的代碼:cellforrowatindexpath。我在查詢單元格是否正在分配,這使得難以等待塊發出函數調用。有什麼建議麼? – Allen

-2

下面是我做的例子:試試吧:

寫這篇以下import語句

typedef double (^add_block)(double,double); 

塊 - 鑑於寫這篇文章做負載

__block int bx=5; 
[self exampleMethodWithBlockType:^(double a,double b){ 
    int ax=2; 
    //bx=3; 
    bx=1000; 
    NSLog(@"AX = %d && BX = %d",ax,bx); 
    return a+b; 
}]; 

NSLog(@"BX = %d",bx); 

方法:

-(void)exampleMethodWithBlockType:(add_block)addFunction { 
    NSLog(@"Value using block type = %0.2f",addFunction(12.4,7.8)); 
} 
+0

可以用這個代碼執行__block NSString * username; [UIView animateWithDuration:0.0動畫:^ { username = @「hI」; NSLog(@「%@」,username); }]; NSLog(@「%@」,username); – Spynet

+0

它運行完美。那麼我認爲問題是Ayon在說什麼 – Geekoder

+0

這沒有任何答案,因爲它使用同步塊執行。 – vikingosegundo

2

fetchIfNeededInBackgroundWithBlock是一種異步方法。這就是爲什麼你最後的NSLog返回null,因爲它是在檢索username之前執行的。所以你想要的可能是在塊內調用一些方法,以確保在獲取用戶數據後執行該方法。事情是這樣的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyUserCell *userCell = (MyUserCell *)[tableView dequeueReusableCellWithIdentifier:MyUserCellIdentifier]; 
    PFUser *user = [[self.messageData objectAtIndex:indexPath.row] objectForKey:@"author"]; 
    userCell.user = user; 
    [user fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error) { 
     if (object == userCell.user && !error) { 
      username = [object objectForKey:@"username"]; 
      cell.textLabel.text = userName; 
     } 
    }]; 
} 

UPDATE:答案被更新爲當塊被稱爲內tableView:cellForRowAtIndexPath:法的要求的情況。 注意:在這裏你可能需要一個自定義單元來存儲對當前用戶的引用,因爲如果你正在重用你的單元格,可能會在同一個單元格被重用於不同的indexPath之後調用block回調(所以它會有不同的用戶)。

+0

這是一個很好的答案!但不幸的是我即將在tableview中運行我的代碼:cellforrowatindexpath。我在查詢單元格是否正在分配,這使得難以等待塊發出函數調用。有什麼建議麼? – Allen

+0

很好的答案+1 – Jitendra

+0

查看最新的答案 – dariaa