我的计划流程
我有一个名为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方法只下载需要下载的任何内容,然后将文本/图像/链接添加到单元格属性。没什么特别的。