2015-09-30 27 views
1

我正在从Parse.com检索数据,并尝试将包含此数据的图像添加到数组中。但是,某些代码没有任何明显的原因没有被执行。这是代码:未在iOS中执行的代码的特定部分

PFQuery *userQuery = [PFUser query]; 
[userQuery whereKey:@"objectId" containedIn:[self.event objectForKey:@"members"]]; 
[userQuery findObjectsInBackgroundWithBlock:^(NSArray *users, NSError *error) { 
    if (!error) { 
     self.membersArray = [NSMutableArray arrayWithArray:users]; 

     [self.tableView reloadData]; 

     for (PFUser *user in self.membersArray) { 

      [self.memberPhotosArray addObject:[NSNull null]]; 
      NSInteger index = [self.memberPhotosArray indexOfObject:user]; 

      PFFile *photoFile = [user objectForKey:@"profilePicture"]; 

      [photoFile getDataInBackgroundWithBlock:^(NSData *result, NSError *error) { 
       if (!error) { 
        NSLog(@"Before creating image"); 
        UIImage *image = [UIImage imageWithData:result]; 
        [self.memberPhotosArray[index] addObject:image]; 
        NSLog(@"After creating image"); 
        [self.tableView reloadData]; 

       } 
      }]; 

     } 

    } 
}]; 

第一个日志正在执行,该行后面的所有内容都没有被调用。有人可以解释为什么并提供解决方案吗?

+0

你没有看到崩溃吗?如果调用[self.memberPhotosArray [index] addObject:image]时图像为零;它会炸毁。另外,我可能是错的,但是你可能会在这个块中保持自我。 – Dare

+0

我不擅长编码,但我使用ARC,所以它不应该自己做所有的保留/释放? – Strikecounter2

+0

保留周期是一个循环,对象相互保持对方。如果任一对象被释放: 对象A不会被释放,因为对象B持有对它的引用。 但是只要对象A有一个引用,对象B就永远不会被释放。 但是对象A永远不会被释放,因为对象B持有对它的引用。 ad infinitum – Dare

回答

2

看起来像你的代码运行在后台线程上。在主线程的最后一个回调块中运行代码。

if (!error) { 
    NSLog(@"Before creating image"); 
     UIImage *image = [UIImage imageWithData:result]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.memberPhotosArray[index] addObject:image]; 
     NSLog(@"After creating image"); 
     [self.tableView reloadData]; 
    }); 
} 

UI相关的操作只能在主线程上执行。

+0

是的,它现在正在执行!但是,当我想将对象添加到给定索引处的数组时,应用程序崩溃并显示以下错误:[__NSArrayM objectAtIndex:]:index bound 9223372036854775807 beyond bounds [0 .. 0]'。为什么这个数字如此之高? – Strikecounter2

+0

它给出了一个无效的索引。让你确定你正在比较正确的对象和'NSInteger index = [self.memberPhotosArray indexOfObject:user];'返回一个有效的整数。 –

+0

我犯了一个拼写错误,现在完美工作,谢谢! – Strikecounter2