0

我在代码中设置了断点以查看问题出在哪里,我发现程序在 cellForRowAtIndexPath 方法中加载单元格时会崩溃,特别是当它从适当的数组 (followeesPhotoURLs) 中检索照片时。这是因为数组是空的 - 因为主线程决定在专用于从互联网下载的线程完成执行(它确实开始执行)之前执行单元加载方法,所以从未下载过照片。

我查看了该课程的审核员讨论组页面,发现其他人也有同样的问题,但该线程从未解决该问题,我通过电子邮件发送了无济于事: http ://groups.google.com/group/iphone- appdev-auditors/browse_thread/thread/ccfc6ae99b4cf45d/ef1b8935e749c7c2?hl=en&lnk=gst&q=presence3#ef1b8935e749c7c2

4

2 回答 2

1

我的 UITableView 的第一条规则是永远不要报告未准备好的部分或行(带有某些东西,即使只是一个占位符),因为它每次都会崩溃。

加载资源时微调器正在旋转。因此,您正在等待可能准备好也可能未准备好的资源,因为您不知道后台进程的确切状态。如何在你的主线程中设置一个值来指示事情还没有准备好。然后,当您的辅助线程完成加载内容时,您可以执行 performSelectorOnMainThread 以使某些主线程函数设置值以指示您可以继续。在值表示继续之前,您的主线程不会尝试访问辅助线程可能接触的那些值。在数据准备好之前,您的单元格可能会显示“正在加载”或类似内容,或者您​​只需在单元格准备好时添加它们。

还有一件事——只有主线程可以触摸 UI。除非明确说明,否则 UIKit 中的任何内容都不是线程安全的。进度指示器的更改必须由主线程处理,它应该启动指示器并停止它(可能当您的辅助线程通知“完成”时,如上所述)。

于 2009-10-26T21:47:05.320 回答
0

我今天刚刚完成了这个工作,这是我观察到的一系列事件:

  1. 您的表格视图将不会加载任何内容,因为您的数组不包含任何内容
  2. 您的线程将去检索 Twitter 数据
  3. 您的表格视图将使用 Twitter 数据刷新 [self.tableView reloadData]

如果你像我一样,你尝试使用类似的东西来设置用户名

cell.textLabel.text = [[userInfo objectAtIndex:indexPath.row] valueForKey:@"name"];

我认为因为它非常具体,所以应用程序真的会尝试寻找它并且如果它没有找到任何东西就不会返回 null ,这与示例中的代码不同

cell.text = [photoNames objectAtIndex:indexPath.row];

...因此您的应用程序在第一次尝试使用空数组加载数据时出错。

我解决这个问题的方法是创建一个数组,从一开始就从属性列表中加载用户名,这样我就知道我的内容数组中应该有多少条目。关键部分是在设置单元之前创建一个条件,以便您知道您拥有所需的所有信息,例如...

    // Set up the cell...
if ([userInfo count] == [userList count]) {

userInfo 是我的字典数组,其中包含来自 Twitter 的数据。

userList 是我的属性列表中的值数组。

于 2010-02-03T07:25:15.337 回答