首页 文章

Swift dispatch_async导致EXC_BAD_ACCESS错误

提问于
浏览
1

在我的Swift项目中,我正在尝试在后台线程中处理FIFO队列(我将其称为列表,以避免混淆) . 当我使用dispatch_async时,只有一些列表被执行后才会导致EXC_BAD_ACCESS错误 . 我已经尽可能地将代码简化为以下的游乐场代码 . 在操场中,当main_thread设置为true时,代码将处理列表中的所有100个项目 . 如果它是假的,只有少数项目得到处理 . 如果代码在项目中,则当main_thread为false时发生EXC_BAD_ACCESS . 显然,我也试过指定一个串行队列,但似乎没有帮助 . 我错过了什么或不理解?谢谢 .

import UIKit

let main_thread = false
let serial_queue = true

class main_class {
    var this_list = list_class()


    func run(){
        for i in 1...100 {
            this_list.add_to_list( String(i) )
        }

        if main_thread {
            this_list.process_list()
        } else {
            if serial_queue {
                let my_serial_queue = dispatch_queue_create("msq", DISPATCH_QUEUE_SERIAL)
                dispatch_async(my_serial_queue){()->Void in
                    self.this_list.process_list()
                }
            } else {
                dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () ->Void in
                    self.this_list.process_list()
                })
            }

        }
    }
}

class list_class {
    var my_list: [String] = []

    func add_to_list( this: String ){
        my_list.append( this )
    }

    func process_list(){
        if my_list.count > 0 {
            print("removing " + my_list[0])
            remove_from_list( my_list[0] )
        }
    }

    func remove_from_list( this: String ){
        let found = my_list.indexOf( this )
        if found != nil {
            my_list.removeAtIndex( found! )
            process_list()
        }
    }
}

var blah = main_class()
blah.run()

2 回答

  • 1

    当后台线程仍在运行时,您的主线程正在退出 . 主线程结束 - >进程终止 .

    在后台线程仍在运行时为main设置一些内容 . 例如,使用 dispatch_group_wait() ;以及 dispatch_group_enter()dispatch_group_leave() .

  • 0

    感谢Graham Perks回答我需要dispatch_group_wait - 我最终根据需要使用了这段代码 . 我没想到需要2个异步调用:( XCPlayground只在操场上需要 .

    import UIKit
    import XCPlayground
    
    var GlobalMainQueue: dispatch_queue_t {
        return dispatch_get_main_queue()
    }
    var GlobalBackgroundQueue: dispatch_queue_t {
        return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
    }
    
    class main_class {
        var this_list = list_class()
        var done = "NO"
        func run(){
            for i in 1...100 {
                this_list.add_to_list( String(i) )
            }
    
            dispatch_async( GlobalBackgroundQueue ){
                let ds_group = dispatch_group_create()
    
                dispatch_group_enter(ds_group)
                dispatch_async(GlobalMainQueue){
                    self.this_list.process_list()
                    dispatch_group_leave(ds_group)
                }
    
                dispatch_group_wait(ds_group, DISPATCH_TIME_FOREVER)
                dispatch_async(GlobalMainQueue){
                    self.done = "YES"
                }
            }
    
        }
    }
    
    class list_class {
        var my_list: [String] = []
    
        func add_to_list( this: String ){
            my_list.append( this )
        }
    
        func process_list(){
            if my_list.count > 0 {
                print("removing " + my_list[0])
                remove_from_list( my_list[0] )
            }
        }
    
        func remove_from_list( this: String ){
            let found = my_list.indexOf( this )
            if found != nil {
                my_list.removeAtIndex( found! )
                process_list()
            }
        }
    }
    
    var blah = main_class()
    blah.run()
    XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
    

相关问题