2016-11-08 7 views
1

I eine Zeichenkette aus plist Datei zu lesen, müssen die Zeichenfolge 105625 Zeichen, die als 325 x 325 Gitterinformationsknoten, I-Schleife verwenden, um die char zu holen:String Subskript dauert lange Zeit

for x in 1...325{ 
    for y in 1...325{ 
     let char = string[string.index(string.startIndex, offsetBy: x * y)] 
     .... 
    } 
} 

aber es ist sehr langsam, warum?

+0

diese setzen Code in dispatch_asyn Block –

+1

Was machst du mit dem Char? Wenn Sie eine teure Operation machen, die es 105625 Mal verwendet, wird das wahrscheinlich die Dinge verlangsamen – Fonix

+0

Holen Sie sich einen Zeiger Verweis auf string.characters und iterieren über den Zeiger. Siehe Beispiel hier https://github.com/petershaw/charsinfile/blob/master/charsinfile/CharReader.swift –

Antwort

0

können Sie versuchen, ein bisschen Einfädeln über diese Methode die Dinge zu beschleunigen, kann in einem normalen dispatch_async das Ganze hat gerade wenn nichts dafür

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
     //put all lengthy calculations here 

     dispatch_async(dispatch_get_main_queue()) { 
      //do any UI updates here 
     } 
    } 

warten muss beenden, wenn Sie tatsächlich wollen obwohl die Berechnung zu beschleunigen, werden Sie die for-Schleifen tun Schleifen in verschiedenen Threads

let group = dispatch_group_create(); 
    let queue = dispatch_queue_create("processStuff", DISPATCH_QUEUE_CONCURRENT) 

    for x in 1...325{ 
     dispatch_group_async(group,queue,{ 
      for y in 1...325{ 
       //do stuff 
      } 
     }) 
    } 

    //dispatch_group_wait(group,DISPATCH_TIME_FOREVER); // use this if you want to wait here, blocking the main thread 

    dispatch_group_notify(group,dispatch_get_main_queue(),{ //use this if you want to be notified when all the groups have finished without blocking the main thread 

    }) 

Warnung brechen müssen: wenn Sie Berechnungen in jedem inneren for-Schleife hängen von anderen Iterationen der anderen für Schleifendurchläufe oder Variablen der Außenseite fo R-Schleife, Ihre Berechnungen könnten versauen, also seien Sie vorsichtig.

+0

Danke für Ihre Hilfe, ich werde später versuchen. – user4851347

0

Ich löste dieses Problem mit einer anderen Methode.

Statt mit String-Index, ich verwenden:

for char in string.characters{ 
    doing some thing 
} 

Above Lösung ist viel schneller als string [string.index (string.startIndex, offsetBy: x * y - 1)]

Verwandte Themen