我的滚动,虽然通常很平滑,但有时会生涩

时间:2015-09-03 15:49:01

标签: swift optimization uiscrollview nsdateformatter

以下是我的代码。我读过使用NSDateFormatters很贵,但我不确定这是不是最终导致问题。

这是我的代码。

func tableViewOld(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> UITableViewCell! {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell

    if cell.backgroundView == nil {
        cell.backgroundView = UIImageView(frame: cell.contentView.bounds)
        cell.backgroundView?.contentMode = UIViewContentMode.ScaleToFill
        cell.backgroundView?.clipsToBounds = true
        cell.contentView.backgroundColor = UIColor.clearColor()

    }

    let backgroundImageView = cell.backgroundView as! UIImageView
    backgroundImageView.image = UIImage(named: "nobg")
    var image : UIImage = UIImage(named:"goodbg")!
    cell.nopebutton.tag = indexPath.row
    cell.nicebutton.tag = indexPath.row
    cell.messageButton.tag = indexPath.row
    cell.mText.text = object.valueForKey("text") as? String
    let count = object.valueForKey("replies") as! Int
    cell.replies.text = "\(count)"
    cell.replies.textColor = UIColor.whiteColor()
    let point = object["location"] as! PFGeoPoint
    let location = CLLocation(latitude: point.latitude, longitude: point.longitude)

    let currentLocation = CLLocation(latitude: currLocation!.latitude, longitude: currLocation!.longitude)
    let distance = currentLocation.distanceFromLocation(location)

    if distance < 50 {
        // TODO: Fill
        cell.locationButton.text = "Nearby"
    } else {
        let distanceFormatter = MKDistanceFormatter()
        distanceFormatter.unitStyle = MKDistanceFormatterUnitStyle.Abbreviated

        cell.locationButton.text = distanceFormatter.stringFromDistance(distance) + " away"
    }

    cell.layoutMargins = UIEdgeInsetsZero


    let score = object.valueForKey("count") as! Int
    cell.count.text = "\(score)"
    if cell.count.text?.toInt() == 0
    {

        cell.messages.imageView?.image = UIImage(named:"0")
        cell.chatbubble.image = UIImage(named:"ch")
        cell.bg.image = UIImage(named: "regular")
        cell.locationButton.textColor = UIColor.blackColor()
        cell.mText.textColor = UIColor(red: 126.0/255, green: 126.0/255, blue: 126.0/255, alpha: 1)
        cell.nicebutton!.setImage(UIImage(named:"ups"), forState: UIControlState.Normal)
        cell.nopebutton!.setImage(UIImage(named:"downs"), forState: UIControlState.Normal)
        cell.count.textColor = UIColor.whiteColor()
        cell.time.textColor = UIColor(red: 52.0/255, green: 152.0/255, blue: 219.0/255, alpha: 1)
    }
            if cell.count.text?.toInt() > 0
    {
        cell.messages.imageView?.image = UIImage(named:"1")
        cell.chatbubble.image = UIImage(named:"chg")
        cell.bg.image = UIImage(named: "gtrl")
        cell.time.textColor = UIColor(red: 42.0/255, green: 204.0/255, blue: 113.0/255, alpha: 1)
        cell.locationButton.textColor = UIColor.blackColor()
        cell.mText.textColor = UIColor(red: 42.0/255, green: 204.0/255, blue: 113.0/255, alpha: 1)
        cell.count.textColor = UIColor.whiteColor()
    }



    if cell.count.text?.toInt() < 0
    {
        cell.messages.imageView?.image = UIImage(named:"-1")
        cell.bg.image = UIImage(named: "ntrl")
        cell.chatbubble.image = UIImage(named:"chr")
        cell.locationButton.textColor = UIColor.blackColor()
        cell.time.textColor =  UIColor(red: 231.0/255, green: 76.0/255, blue: 50.0/255, alpha: 1)
        cell.mText.textColor = UIColor(red: 231.0/255, green: 76.0/255, blue: 50.0/255, alpha: 1)
        cell.count.textColor = UIColor.whiteColor()
    }

    if cell.count.text?.toInt() >= 100
    {
        cell.messages.imageView?.image = UIImage(named:"100")
        cell.chatbubble.image = UIImage(named:"chb")
        cell.locationButton.textColor = UIColor.blackColor()
        cell.time.textColor = UIColor(red: 249.0/255, green: 194.0/255, blue: 65.0/255, alpha: 1)
    cell.mText.textColor = UIColor(red: 249.0/255, green: 194.0/255, blue: 65.0/255, alpha: 1)
    cell.bg.image = UIImage(named: "neutral")
    cell.count.textColor = UIColor.whiteColor()
    }

    if let dict : NSDictionary = NSUserDefaults.standardUserDefaults().objectForKey("userNiceNopeDictionary") as? NSDictionary {
        cell.nicebutton.enabled = true
        cell.nopebutton.enabled = true
        if let nice  = dict[object.objectId] as? Bool{
            if nice {
                cell.nicebutton.enabled = false
            }
            else {
                cell.nopebutton.enabled = false
            }
        }
    }
    if let user = PFUser.currentUser() {
        user["createdBy"] = user.username
        //user.saveInBackground()


    }
    let dateUpdated = object.createdAt as NSDate
    let dateFormat = NSDateFormatter()
    dateFormat.dateFormat = "h:mm a"
    cell.time.text = (NSString(format: "%@", dateFormat.stringFromDate(dateUpdated)) as String) as String
    let replycnt = object.objectForKey("replies") as! Int



    if cell.count.text == "\(-10)"
    {
        object.deleteInBackground()
    }

    return cell

}

我正在使用此扩展程序。

extension NSDate
{
 func hour() -> Int
{
    //Get Hour
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.CalendarUnitHour, fromDate: self)
    let hour = components.hour

    //Return Hour
    return hour
}


func minute() -> Int
{
    //Get Minute
    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components(.CalendarUnitMinute, fromDate: self)
    let minute = components.minute

    //Return Minute
    return minute
}

func toShortTimeString() -> String
{
    //Get Short Time String
    let formatter = NSDateFormatter()
    formatter.timeStyle = .ShortStyle
    let timeString = formatter.stringFromDate(self)

    //Return Short Time String
    return timeString
}

}

有没有办法可以优化这个?同样,这并不总是滞后,它有时只会发生,但总的来说似乎没问题。我想一直很好。我觉得好像NSDateFormatter可能是问题,但我不太确定。

1 个答案:

答案 0 :(得分:1)

你在cellForRow方法中做了很多事情。作为比较,我的cellForRow方法由大约5行代码组成。您应该考虑创建一个删除大量代码的自定义单元类。有了很多代码,它就会让你更难弄清楚问题的原因是什么。

该代码的每个部分配置文本字段可能是一个新功能。只是,每个功能的目标是10行代码。如果你有更多,将东西移动到一个新的功能(这是有道理的)。

导致此问题的原因是每次使用NSDateFormatter方法时都会创建toShortTimeString

事实上,我刚刚看到你自己创造了另一个NSDateFormatter。创建NSDateFormatter是件昂贵的事情。您应该创建一个作为TableViewController的属性并反复使用它,而不是一次又一次地创建它。

这似乎可能是问题但你的功能太大而无法全部阅读。努力解决这个问题。

函数中需要的行数... 3.

  • 1使细胞出列。
  • 1调用函数来配置单元格
  • 1返回单元格