2016-05-30 15 views
0

Ich bin Hintergrund Thread in einer While-Schleife, wo ich einige Datei-Handling-Aufgabe. Ich habe einen Code nach der Schleife. Aber die Codes nach der Schleife, die ausgeführt wird, bevor die Schleife endet (weil ich Hintergrundthread verwende). Gibt es irgendeine Möglichkeit, Code genau nach Ablauf der Schleife auszuführen?Run Code nach Schleife im Hintergrund endet

Hier ist mein Code:

while i < testCount { 
    let task = AsyncTask(
     backgroundTask: { 
      () -> Double in 
      // some file handling 
      return 234.09 

     }, 
     afterTask: { 
      (val: Double) in 
      self.showVal(val) 
     } 
    ); 
    task.execute(); 

    i += 1 
} 

// I want to run this code after the loop ends 
print("average: \(avg)") 
showVal(avg) 

Meine showVal(Double) Funktion

func showVal(val: Double) { 
    print("val found: \(val)") 
    display.text = "\(val) found" 
} 

Und hier ist meine AsyncTask Klasse

public class AsyncTask <BGParam,BGResult>{ 
    private var pre:(()->())?;//Optional closure -> called before the backgroundTask 
    private var bgTask:(param:BGParam)->BGResult;//background task 
    private var post:((param:BGResult)->())?;//Optional closure -> called after the backgroundTask 

    public init(beforeTask: (()->())?=nil, backgroundTask: (param:BGParam)->BGResult, afterTask:((param:BGResult)->())?=nil){ 
     self.pre=beforeTask; 
     self.bgTask=backgroundTask; 
     self.post=afterTask; 
    } 

    public func execute(param:BGParam){ 
     pre?()//if beforeTask exists - invoke it before bgTask 
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), { 
      let bgResult=self.bgTask(param: param);//execute backgroundTask in background thread 
      if(self.post != nil){//if afterTask exists - invoke it in UI thread after bgTask 
       dispatch_async(dispatch_get_main_queue(),{self.post!(param: bgResult)}); 
      } 
     }); 
    } 
} 

Hinweis: Ich bin ein Anfänger in Swift.

Edit: Ich möchte eigentlich tun:

  1. Ein Hintergrund-Datei Handhabung Aufgabe
  2. Nachdem die Aufgabe beendet ist, möchte ich in einem UILabel

ich einen Text zeigen, müssen diese zwei Aufgaben mehrmals (sagen wir 100 mal). Wenn swift einfachere Methoden für meinen Zweck hat, bitte informieren.

+0

Die pragmatische Option wäre einfach, einen if-check auf Ihrem Zähler zu haben und den Code daraus auszuführen. Auch auf einer kleinen, schnellen Code-ähnlichen Notiz würde ich vorschlagen, 'für i in 0 ..

+0

Okay. Kannst du bitte meine Änderungen sehen, habe ich meinen eigentlichen Zweck erwähnt. –

+0

Also, lass mich sehen, ob ich das richtig verstanden habe. Sie müssen eine Hintergrund-Datei-Behandlung eine unbekannte Anzahl von Zeiten durchführen, und wenn alle diese abgeschlossen sind, möchten Sie etwas anderes tun (?) –

Antwort

0

Ich werde versuchen mit einigen Pseudo-Code basierend auf unserer Diskussion, um zu sehen, ob das Ihnen auf dem Weg helfen könnte. Der Manager-Objekt aussehen würde wahrscheinlich ein wenig etwas wie folgt aus:

class RequestManager { 
    private let requiredNumberOfRequests: Int 
    private let completionHandler:()->() 
    private var counter: Int { 
     didSet { 
      if counter == requiredNumberOfRequests { 
       completionHandler() 
      } 
     } 
    } 

    init(numberOfRequests: Int, completionHandler:()->()) { 
     self.requiredNumberOfRequests = numberOfRequests 
     self.completionHandler = completionHandler 
     self.counter = 0 
    } 

    // Don't know exactly what you want to do here, but something like... 
    func performRequest(success: (value: Double)->()) { 
     // Network stuff, on success it looks like you'll have a Double(?) 
     let value: Double = 234.09 
     success(value: value) 
     counter += 1 
    } 
} 

Dann, bevor der Schleife erhalten Sie eine Instanz der requestManager

let manager = RequestManager(numberOfRequests: 100) { average in 
    print("average: \(average)") 
} 
erstellen

... und die performRequest als Teil nennen deiner Schleife.

Verwandte Themen