In meinem Swift-Projekt versuche ich eine FIFO-Warteschlange (ich werde es hier eine Liste nennen, um Verwirrung zu vermeiden) in einem Hintergrund-Thread. Wenn ich dispatch_async verwende, führt dies zu einem EXC_BAD_ACCESS-Fehler, nachdem nur ein Teil der Liste ausgeführt wurde. Ich habe den Code soweit wie möglich in den folgenden Spielplatzcode vereinfacht. Wenn auf dem Spielplatz main_thread auf "true" gesetzt ist, verarbeitet der Code alle 100 Elemente in der Liste. Wenn es falsch ist, werden nur eine Handvoll Elemente verarbeitet. Wenn sich der Code in einem Projekt befindet, tritt EXC_BAD_ACCESS auf, wenn main_thread falsch ist. Offensichtlich habe ich auch versucht, eine serielle Warteschlange anzugeben, aber das scheint nicht zu helfen. Was vermisse ich oder verstehe ich nicht? Danke.Swift dispatch_async führt zu EXC_BAD_ACCESS Fehler
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()
Ich bin offensichtlich einige ziemlich Kernkonzept fehlt hier :(Der Punkt des Setzens dispatch_async dort war so der Haupt-Thread wurde nicht blockiert. Ich bin jetzt schrecklich verwirrt. – Matt
@Matt: Der Punkt von 'dispatch_async' in dort war so, dass der Hauptthread * durch diese asynchrone Arbeitsbelastung * nicht blockiert wurde. Der Hauptfaden ist dann frei, andere Sachen zu tun, wie warten auf I/O. Wenn Sie nichts anderes tun müssen, ist 'dispatch_async' sinnlos. –
In einer" normalen "App wäre main beschäftigt, etwas anderes zu tun, oder auf Benutzereingaben zu warten, alles andere als enden Der Umgang mit Benutzereingaben ist wichtig und wichtig, um schnell zu reagieren, so dass Sie nicht lange arbeiten müssen . Du hast es richtig, das zu einem Hintergrund-Thread zu verschieben. Aber in Ihrem Beispiel gibt es keine Benutzereingaben für main, damit das Modell nicht relevant ist. –