swift - 我的滚动虽然通常很顺利,但有时会很不稳定

标签 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 可能是问题所在,但我不太确定。

最佳答案

您在 cellForRow 方法中做了很多事情。作为比较,我的 cellForRow 方法由大约 5 行代码组成。您应该考虑创建一个自定义单元类来删除大量代码。代码太多只会让找出问题原因变得更加困难。

配置文本字段的代码的每个部分都可以是一个新函数。只是,每个函数的目标是 10 行代码。如果您有更多内容,请将内容移至新函数中(这是有意义的)。

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

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

这似乎可能是问题所在,但您的函数太大,无法阅读全部内容。也要努力解决这个问题。

函数所需的行数... 3.

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

关于swift - 我的滚动虽然通常很顺利,但有时会很不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32380215/

相关文章:

c# - 如何优化 "real-time"C#写文件和MATLAB读文件操作

iphone - 当 UITextField 成为第一响应者时,如何使 UIScrollView 自动滚动

swift - 如何使 Onboarding 与 iOS13 中的 Scene Delegate 配合使用?

ios - Scenekit写入退出没有错误

swift - 如何在 tvOS 中获得焦点 View 帧大小?

mysql - Zend Framework $table->fetchRow() 非常慢

optimization - Jekyll 编译似乎太慢了

uiscrollview - 无法添加新的对齐约束自动布局Xcode 6

iphone - 自动滚动 UIScrollView 以适应 native iOS Mail.app 中的内容

ios - GeofencePlugin Cordova 插件不适用于 IOS