【问题标题】:Specific part of code not being executed in iOS代码的特定部分未在 iOS 中执行
【发布时间】:2015-12-28 18:56:08
【问题描述】:

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

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];

                }
            }];

        }

    }
}];

第一个日志正在执行,此行之后的所有内容都没有被调用。有人可以解释原因并提供解决方案吗?

【问题讨论】:

  • 你没有看到崩溃是吗?如果调用 [self.memberPhotosArray[index] addObject:image]; 时图像为 nil;它会爆炸。另外,我可能是错的,但你可能会在那个街区保留自我。
  • 我不太擅长编码,但我使用的是 ARC,所以它不应该自己完成所有的保留/释放吗?
  • 保留循环是对象相互保留的循环。如果任一对象被释放:对象 A 将不会被释放,因为对象 B 持有对它的引用。但是只要对象 A 有对它的引用,对象 B 就永远不会被释放。但是对象 A 永远不会被释放,因为对象 B 持有对它的引用。无止境
  • 我想我理解了,但我怀疑我是否保留了它。但是,ARC 不是在为我做所有这些事情吗?

标签: ios objective-c arrays image parse-platform


【解决方案1】:

看起来您的代码正在后台线程上运行。在主线程的最终回调块中运行代码。

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 相关操作只能在主线程上执行。

【讨论】:

  • 是的,它现在正在执行!但是,当我想将对象添加到给定索引处的数组时,应用程序崩溃并出现错误:[__NSArrayM objectAtIndex:]: index 9223372036854775807 beyond bounds [0 .. 0]'。为什么这个数字如此之高?
  • 它给出的索引无效。确保您在比较正确的对象并且NSInteger index = [self.memberPhotosArray indexOfObject:user]; 返回一个有效整数。
  • 我拼写错误,现在可以正常使用了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多