swift - 缓慢的 while 循环。 swift

标签 swift while-loop

我对下面的代码有一些问题。当线路数超过 10000 时,应用程序基本上会崩溃,或者至少不会响应或执行任何操作。

label.text可以毫无问题地输出整个文本文件。并且将整个 25000 行文件存储在 textArr -array 中没有问题。

但是当尝试对大于 10000 行的文件执行 while 循环时,它不会响应。

有什么建议可以解决这个问题吗? :-)

    let path = NSBundle.mainBundle().pathForResource("thefile", ofType: "log")
    var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
    var textArr = text.componentsSeparatedByString("\r\n")
    var lines = textArr.count

    var user_event=1
    var user_state=1
    var user_info=1
    var user_devcom=1
    var user_warning=1
    var user_io=1
    var user_useract=1
    var user_error=1

    class ViewController2: UIViewController {

     override func viewDidLoad() {

            label.font = UIFont(name: label.font.fontName, size: 8)

            super.viewDidLoad()

            var n=0

            while n < lines{

                var rad: String = textArr[n]

                if user_event == 1{
                   if rad.lowercaseString.rangeOfString("  event ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }
                }

                if user_state == 1{
                    if rad.lowercaseString.rangeOfString("  state ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }

                }

                if user_info == 1{
                    if rad.lowercaseString.rangeOfString("  info ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"

                    }
                }

                if user_devcom == 1{
                    if rad.lowercaseString.rangeOfString("  devcom ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }
                }

                if user_warning == 1{
                   if rad.lowercaseString.rangeOfString("  warning ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }
                }

                if user_io == 1{
                   if rad.lowercaseString.rangeOfString("  io ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }
                }

                if user_useract == 1{
                    if rad.lowercaseString.rangeOfString("  useract") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    }
                }

                if user_error == 1{
                    if rad.lowercaseString.rangeOfString("  error ") != nil{
                        label.text = "\(label.text!)\(rad)"
                        label.text! += "\r\r"
                    } 
                }
               n=n+1
            }
        }

最佳答案

您的应用没有响应,因为它在主线程上执行了大量工作(特别是您的非最佳字符串处理和大量属性访问可能是主要瓶颈)。您应该尝试offload that into a background thread 。请注意,您需要在主线程上分配 UILabeltext 属性!因此,在变量中构建字符串,并在完成处理后将其分配给主线程上的 text 属性。

此外,还会创建许多自动释放的对象,并且直到您从 viewDidLoad 返回后的一段时间才会释放该对象。您应该添加一个每次迭代都会清空的自动释放池,如下所示:

while n < lines {
    autoreleasepool {
        // Insert your "while" body here.
    }
}

最后但并非最不重要的一点是,由于 while 中的最后一个语句是 n=n+1,因此您应该使用 for 循环:

for n in 0..<lines {
    autoreleasepool {
        // Insert your former "while" body here.
    }
}

使用 NSMutableString 处理流程将如下所示:

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // Background thread. Do NOT access your label here!
    let string = NSMutableString()
    for n in 0..<lines {
        autoreleasepool {
            let rad: String = textArr[n]

            if user_event == 1 {
                if rad.lowercaseString.rangeOfString("  event ") != nil {
                    string.appendString(rad)
                    string.appendString("\r\r")
                }
            }

            // ...
        }
    }

    dispatch_async(dispatch_get_main_queue()) {
        // Update label on main thread.
        label.text = string
    }
}

关于swift - 缓慢的 while 循环。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555733/

相关文章:

ios - 处理 Swift 扩展中的类初始化失败

ios - 以编程方式为新 CollectionView 添加 TabItem

java - 在 while 循环内调用堆栈

mysql - 如何在 while 循环内分页?

ios - Swinject 中不同 ViewController 的依赖注入(inject)不一致,发布 Swift 3.0 更新 : why?

ios - URL 未在 webview 上加载

ios - swift生成的IPA好大,大概5MB

php - 如何通过php从mysql中删除一行

c - 使用 macOS High Sierra 时在 C 中使用 while(free) 而不是 while(true)

Java while 循环在不同操作系统上的工作方式不同