2017-03-17 8 views
0

CSVImporter https://github.com/Flinesoft/CSVImporterを使用していますので、.csvファイルからデータをインポートします。それは正常に動作しますが、viewDidLoad関数の他の部分が実行される前にインポートを開始します。CSVImporterはviewdidload後にインポートを開始します。[Swift]

次のコードは単なるテストですが、他のviewDidLoadコードが実行される前にCSVImporterがインポートを完了するようにするソリューションか、viewDidLoadの後で自動的に起動する関数が必要です。それは "Begin2" を印刷し、6回のプリントはnilだから、最初

var Vokabeln: [[String]]? 


var i = 0 


override func viewDidLoad() { 
    super.viewDidLoad() 


    let path = "/Users/---CENSORED---/Documents/TestLöschen/TestLöschen/Vokabeln.csv" 
    let importer = CSVImporter<[String]>(path: path, delimiter: ";") 
    importer.startImportingRecords { $0 }.onFinish { importedRecords in 
     for record in importedRecords { 
      self.Vokabeln?[self.i][0] = record[0] 
      self.Vokabeln?[self.i][1] = record[1] 
      self.Vokabeln?[self.i][2] = record[2] 
      print("Begin1") 
      print(record[0]) 
      print(record[1]) 
      print(record[2]) 
      print("End1") 
      self.i += 1 
     } 
    } 

    print("Begin2") 
    print(Vokabeln?[0][0]) 
    print(Vokabeln?[0][1]) 
    print(Vokabeln?[0][2]) 
    print(Vokabeln?[1][0]) 
    print(Vokabeln?[1][1]) 
    print(Vokabeln?[1][2]) 
    print("End2") 
} 

は、ここに私のコードです。次に、関数viewDidLoadが終了すると、 "Begin1"が出力され、次に正しい変数と "End1"が出力されます。

誰か助けてくれますか?おかげさまで

+3

"CSVImporterはデフォルトで非同期で動作するため、メインスレッドをブロックしません。"あなたのlibに関するドキュメントを読んでください。メインスレッドをブロックしないでください。 'onFinish {}'クロージャで残りのメソッドを呼び出します。あるいは、 'Import Synchronously'の部分を読んでください。 – Larme

+0

@Larme私はそれを同期させましたが、彼はそれにもかかわらず何も印刷しません。 – Blub

答えて

0

startImportingRecordsは、リピートループの後に完了ハンドラにVokabelnを印刷するコードを置くだけです。

最初に配列を初期化する必要があります。それ以外の場合は何も追加されません。配列をオプションとして宣言しないでください。変数名は小文字で始まるはずです。

var vokabeln = [[String]]() 

UIを更新する場合の例

importer.startImportingRecords { $0 }.onFinish { importedRecords in 
    for record in importedRecords { 
     self.vokabeln[self.i][0] = record[0] 
     self.vokabeln[self.i][1] = record[1] 
     self.vokabeln[self.i][2] = record[2] 
     print("Begin1") 
     print(record[0]) 
     print(record[1]) 
     print(record[2]) 
     print("End1") 
     self.i += 1 
    } 
    DispatchQueue.main.async { 
     print("Begin2") 
     print(self.vokabeln[0][0]) 
     print(self.vokabeln[0][1]) 
     print(self.vokabeln[0][2]) 
     print(self.vokabeln[1][0]) 
     print(self.vokabeln[1][1]) 
     print(self.vokabeln[1][2]) 
     print("End2") 
    } 
} 

のディスパッチブロック内のコードをラップしかし、別の問題が依然として存在します。配列を[[String]]と宣言すると、外側と内側の両方の配列が空になり、インデックス添字付きの値を代入することはできません。この構文をお勧めします。

for record in importedRecords { 
    self.vokabeln.append(record) // this appends the whole record array 
    print("Begin1") 
    print(record) 
    print("End1") 
} 

PS:JSONやプロパティリストなどのより適切なテキスト形式を使用することを検討してください。

+0

でも、なぜオプションを宣言してはいけないのですか? – Blub

+0

これは、非オプションの具体的なデータとして使用するためです。データを受信/変換できない場合、配列は空です。これは、オプションのバインディングよりも使いやすく、すべての疑問符を省略することができます。オプションは* I-don't-care *のアリバイとして使用しないでください。 – vadian

+0

とディスパッチブロックとは何ですか?印刷されたコードは一例に過ぎませんでした。実際のコードはかなり大きいです。 – Blub

関連する問題