swift

时间:2016-07-11 14:59:41

标签: ios json swift optional

我的计划流程

我有一个名为News Item的类。在其中,我有一个方法转到服务器并获取JSON数据并创建一个NewsItem实例,该实例使用SWIFTYJson库在for循环中包含每个JSON数据详细信息,如下所示:

static func downloadNewsItems(completionBlock block : ([NewsItem]) -> ()) {

var newsItems = [NewsItem]()
let url = NSURL(string: "http://a-url-that-has-stuff")
let networkService = NetworkService(url: url!)

networkService.downloadData { (data) -> Void in

  let jsonData = JSON(data:data)
  for item in jsonData["stories"].arrayValue {

    let newsArticle = NewsItem()
    newsArticle.storyCategory = item["category"].string
    newsArticle.titleText = item["title"].string
    newsArticle.paragraph1 = item["paragraph1"].string
    newsArticle.paragraph2 = item["paragraph2"].string
    newsArticle.featureImage = item["headerImage"].string
    newsArticle.storyDate = item["date"].string
    newsArticle.majorReference = item["majorReference"].string
    newsArticle.fact = item["fact"].string

    newsItems.append(newsArticle)

  }

  dispatch_async(dispatch_get_main_queue(), { () -> Void in
    block(newsItems)
  })
 }
}

我有一个collectionViewController,它调用此方法,获取对象并将它们附加到一个数组,然后我用它来加载集合视图数据。

我的问题

如果您查看代码,此时,每个newsArticle都必须具有新闻项的所有属性才能使其生效。我不喜欢这种行为。我正在考虑向NewsItem类添加更多属性,这些属性不是必需的,但如果可用,则应加载并正确实例化。例如,我想在News Item类中添加第二个图像,但并不是每个新闻项都会有第二个图像。如果我将一个没有'titleText'的新闻项添加到后端,代码就会中断。

我想添加第二个图像功能,如果新闻项目有“第二个图像”,那么我想实例化一个UIImageView并使用此图像将其添加到collectionView。

我知道我应该以某种方式使用选项,但我不能完全破解它。我正在使用Swift 3.我必须承认,自从我开始迅速以来,我一直是我的存在的祸根。任何帮助,将不胜感激。丹科!

修改

我正在实现newsItem类,如下所示:

class HomeViewController: UIViewController {

 var newsItems = [NewsItem]()

override func viewDidLoad() {
    super.viewDidLoad()

NewsItem.downloadNewsItems{ (newsItems) -> () in

      self.newsItems = []
      self.newsItems = newsItems
      self.collectionView.reloadData()
    }
 }
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return newsItems.count
}


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as! NewsCollectionViewCell

  let story = newsItems[indexPath.item]
  cell.configureCell(story)
  return cell

 }
}

configureCell方法只下载需要下载的任何内容,然后将文本/图像/链接添加到单元格属性。没什么特别的。

0 个答案:

没有答案