尝试访问方法块,但我不知道如何:
__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
如何访问变量'用户名'从这个代码之外的代码?
答案 0 :(得分:6)
实际上您正在访问块外的变量用户名。您将获得null,因为该块在另一个线程中运行,并且您在块完成执行后设置该值。因此,当块运行时,你的最后一行已经在主线程中执行了,因此在执行最后一行时没有设置它的值。这就是你得到null的原因。
答案 1 :(得分: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;
}
}];
}
更新:对于根据请求在tableView:cellForRowAtIndexPath:
方法内调用块的情况,更新答案。
注意:在这里,您可能需要一个自定义单元格来存储对当前用户的引用,因为如果您正在重用单元格,则可能会在为不同的indexPath重用相同的单元格后调用块回调(因此它将具有不同的用户) )。
答案 2 :(得分:1)
我建议使用WWDC中提供的NSOperationQueue。看到这篇文章作为参考,它认为它会有所帮助: https://stavash.wordpress.com/2012/12/14/advanced-issues-asynchronous-uitableviewcell-content-loading-done-right/
答案 3 :(得分:-2)
以下是我所做的例子:尝试一下:
在导入语句下面写下
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));
}