【问题标题】:Array out of index because of download delay由于下载延迟,数组超出索引
【发布时间】:2015-09-19 13:34:19
【问题描述】:

我正在开发一个应用程序,它可以从 Facebook 下载名称和图像,并将它们显示到 CollectionView 中。图片功能运行得很好,但是我对名称感到困惑。这是文本的 CollectionView 函数内的代码:

let url = NSURL(string: "http://www.facebook.com/" + newArray[indexPath.row])!
    let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) -> Void in

        if let urlContent = data {

            let webContent = NSString(data: urlContent, encoding: NSUTF8StringEncoding)
            let websiteArray = webContent!.componentsSeparatedByString("pageTitle\">")
            let secondArray = websiteArray[1].componentsSeparatedByString("</title>")
            let title = secondArray[0]
            //----- serperated ---------
            dispatch_async(dispatch_get_main_queue())
                {

                    if title == "Page Not Found" || title == "Pagina Niet Gevonden" {

                    } else {

                        stalkers.append(title)

                    }
            }

        }


    }
    task.resume()

    cell.label.text = stalkers[indexPath.row]
    return cell

问题是当应用程序启动时,它会因错误“数组超出索引”而崩溃。我认为这是因为加载时数组为空,下载需要一段时间。我不知道如何让标签在下载后显示每个名称..

非常感谢任何帮助,真的!谢谢!

【问题讨论】:

  • 下载完成后尝试设置labelText。您可以在异步下载完成后编写回调处理程序
  • 这就是完成块的用途:) 1. 下载您的数据 2. 当数据完成附加到数组调用 collectionView.reloadData 或类似(我对集合视图不是很有经验)如果 collectionView有一个数据源 delegate-numberOfSomething-method,您可以简单地将计数设置为您的 array.count,以防止它尝试从 stalkers 数组加载。
  • 对不起,错过了关于图片工作正常的部分。如果名称和图片相关,您可以创建一个具有字符串和 UIImage 作为属性的模型用户(或类似),并用这些填充 CV。 (或选择 William Hu 的回答)

标签: ios swift uicollectionview swift2


【解决方案1】:

先检查一下:

if stalkers.count >= indexPath.row {
  cell.label.text = stalkers[indexPath.row]
}

下载后,分配标题:

dispatch_async(dispatch_get_main_queue())
                {

                    if title == "Page Not Found" || title == "Pagina Niet Gevonden" {
                    } else {
                        stalkers.append(title)
                    }
    cell.label.text = stalkers[indexPath.row] //Add this line after download done.
            }

【讨论】:

  • @Wiliam Hu 请在我的回答中查看我的代码
  • 我尝试使用您的代码,但无论出于何种原因,只有当我向下滚动到底部时才会加载名称,而当我向后滚动时,会加载相同的名称,所以基本上永远不会加载名称显示在集合视图中
  • dataTaskWithURL() 是一个异步函数,这意味着它块上的代码将在获取数据后运行。你必须在这个异步块内设置 textLabel,而不是在外面。这是在这个答案中完成的。
  • 也许你可以上传你的代码。或者您是否可以检查是否由于滚动时调用的 url 而设置了一些缓存内容错误。
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2013-02-08
  • 2019-10-29
相关资源
最近更新 更多