如何过滤要在表视图中使用的JSON对象数组?

时间:2015-10-23 16:42:25

标签: ios json swift

我从API获取JSON数据并在对象中解析数据,然后将对象简单地存储在对象数组中。对象本身包含有关报纸文章的数据。但是,我需要过滤该数据。我从JSON获得的一些对象实际上没有文章内容,因为它们是图片而不是文章(即API的JSON中的一些“节点”具有我不希望在我的表视图中看到的内容)

在我的JSON解析函数中,我试图使它只有在“articleContent”变量的字符数大于40时,解析的对象才会被添加到已解析对象的数组中。这就是它看起来像。

if issueElement.articleContent.characters.count > 40 {
    self.currentIssueObjects.addObject(issueElement)
}

但是,这根本行不通。我得到典型的“在展开可选值时意外发现的nil”错误消息(我没有得到错误的特定行)。我怎样才能做到这一点?我本质上是试图阻止数组中有空文章内容的对象,因为这会搞砸我的表视图(空单元格,重复项等等)。

这是我的cellForRowAtIndexPath代码和我的JSON解析代码:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell {

    let row = indexPath.row

    guard let cell = tableView.dequeueReusableCellWithIdentifier(CurrentIssueArticlesTableCellIdentifier, forIndexPath: indexPath) as? CurrentIssueArticlesTableViewCell else {

        print ("error: currentIssueTableView cell is not of class CurrentIssueArticlesTableViewCell, we will use EditorialsTableViewCell instead")
        return tableView.dequeueReusableCellWithIdentifier(CurrentIssueArticlesTableCellIdentifier, forIndexPath: indexPath) as! EditorialsTableViewCell
    }

    let currentIssueObject = currentIssueObjects.objectAtIndex(indexPath.row) as! IssueElement

        let title = currentIssueObject.title ?? ""

        let timeStampDateObject = NSDate(timeIntervalSince1970: NSTimeInterval(currentIssueObject.timeStamp))
        let timeStampDateString = dateFormatter.stringFromDate(timeStampDateObject) ?? "Date unknown"

    if let author = currentIssueObject.author {

        cell.currentIssueArticlesAuthorLabel!.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
        cell.currentIssueArticlesAuthorLabel!.text = author

    }

        let issueNumber = currentIssueObject.issueNumber ?? ""
        let volumeNumber = currentIssueObject.volumeNumber ?? ""

        let articleContent = currentIssueObject.articleContent ?? ""

        let nodeID = currentIssueObject.nodeID ?? 0

        cell.currentIssueArticlesHeadlineLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
        cell.currentIssueArticlesHeadlineLabel.text = title



        cell.currentIssueArticlesPublishDateLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
        cell.currentIssueArticlesPublishDateLabel.text = timeStampDateString

        if row == 0 {

            cell.userInteractionEnabled = false

            let imageURL = (currentIssueObjects.objectAtIndex(row) as! IssueElement).imageURL

            cell.currentIssueArticlesHeadlineLabel.textColor = UIColor.clearColor()
            cell.currentIssueArticlesAuthorLabel.textColor = UIColor.clearColor()
            cell.currentIssueArticlesPublishDateLabel.textColor = UIColor.clearColor()

            cell.request?.cancel()

            if let image = self.imageCache.objectForKey(imageURL!) as? UIImage {
                cell.currentIssueArticlesBackgroundImageView.image = image
            } else {
                cell.currentIssueArticlesBackgroundImageView.image = UIImage(named: "reveal Image")
                cell.request = Alamofire.request(.GET, imageURL!).responseImage() { response in
                    if response.result.error == nil && response.result.value != nil {
                        self.imageCache.setObject(response.result.value!, forKey: response.request!.URLString)
                        cell.currentIssueArticlesBackgroundImageView.image = response.result.value
                    } else {

                    }
                }
            }
            cell.currentIssueArticlesBackgroundImageView.hidden = false
        }

        else {
            cell.currentIssueArticlesBackgroundImageView.hidden = true
    }
    return cell
}

JSON解析代码:

func populateCurrentIssue() {
    if populatingCurrentIssue {
        return
    }

    populatingCurrentIssue = true

    self.cellLoadingIndicator.backgroundColor = goldenWordsYellow
    self.cellLoadingIndicator.startAnimating()

    Alamofire.request(GWNetworking.Router.Issue).responseJSON() { response in
        if let JSON = response.result.value {

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {

                var nodeIDArray : [Int]

                if (JSON .isKindOfClass(NSDictionary)) {

                    for node in JSON as! Dictionary<String, AnyObject> {

                        let nodeIDValue = node.0
                        var lastItem : Int = 0

                        self.nodeIDArray.addObject(nodeIDValue)

                        if let issueElement : IssueElement = IssueElement(title: "Could not retrieve title", nodeID: 0, timeStamp: 0, imageURL: "init", author: "Author not found", issueNumber: "Issue # error", volumeNumber: "Volume # error", articleContent: "Could not retrieve article content", coverImageInteger: "init", coverImage: UIImage()) {

                            issueElement.title = node.1["title"] as! String
                            issueElement.nodeID = Int(nodeIDValue)!

                            let timeStampString = node.1["revision_timestamp"] as! String
                            issueElement.timeStamp = Int(timeStampString)!

                            issueElement.imageURL = String(node.1["image_url"])

                            if let author = node.1["author"] as? String {
                                issueElement.author = author
                            }
                            if let issueNumber = node.1["issue_int"] as? String {
                                issueElement.issueNumber = issueNumber
                            }
                            if let volumeNumber = node.1["volume_int"] as? String {
                                issueElement.volumeNumber = volumeNumber
                            }

                            if let articleContent = node.1["html_content"] as? String {
                                issueElement.articleContent = articleContent
                            }

                            issueElement.coverImageInteger = String(node.1["cover_image"]) // addition specific to the Current Issue View Controller

                            lastItem = self.currentIssueObjects.count


                          print(issueElement.nodeID)

                            if issueElement.articleContent.characters.count > 40 {
                                self.currentIssueObjects.addObject(issueElement)
                                print(issueElement.nodeID)
                            }

                            // Sorting with decreasing timestamp from top to bottom.
                            let timestampSortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
                            self.currentIssueObjects.sortUsingDescriptors([timestampSortDescriptor])

                            // Placing the object with coverImage

                            let coverImageSortDescriptor = NSSortDescriptor(key: "coverImageInteger", ascending: false)
                            self.currentIssueObjects.sortUsingDescriptors([coverImageSortDescriptor])

                            let indexPaths = (lastItem..<self.currentIssueObjects.count).map {
                                NSIndexPath(forItem: $0, inSection: 0) }
                            }
                        }
                    }

                dispatch_async(dispatch_get_main_queue()) {
                    self.currentIssueTableView.reloadData()

                    self.cellLoadingIndicator.stopAnimating()
                    self.cellLoadingIndicator.hidesWhenStopped = true

                }
            }
        }

        self.populatingCurrentIssue = false
}
}

0 个答案:

没有答案
相关问题