2016-11-09 9 views
-1

ウェブをクロールしたい、現在12000のURLを持つtxtファイルを読んでいるが、このプロセスでは並行性を使用したいがリクエストは機能しない。AlamoFireなしで同時の非同期HTTPリクエストを作成する方法

typealias escHandler = (URLResponse?, Data?) -> Void 

func getRequest(url : URL, _ handler : @escaping escHandler){ 

let session = URLSession( 
    configuration: .default, 
    delegate: nil, 
    delegateQueue: nil) 

var request = URLRequest(url:url) 

request.httpMethod = "GET" 

let task = session.dataTask(with: request){ (data,response,error) in 

     handler(response,data)  
} 

task.resume() 

} 


    for sUrl in textFile.components(separatedBy: "\n"){ 
     let url = URL(string: sUrl)! 

     getRequest(url: url){ response,data in 

      print("RESPONSE REACHED") 

     } 
    } 

答えて

0

あなたが正常に動作し、あなたのURLSessionsを持っている場合は、あなたが行く必要があるすべては、あなたが完了したいあなたの非同期タスクのそれぞれについて、Operationを作成し、あなたの操作キューに追加し、にあなたのOperationQueueのmaxConcurrentOperationCountを設定し、別OperationQueueを作成することです一度に実行できるタスクの数を制御します。 Puesdoコード:

let operationQueue = OperationQueue() 
operationQueue.qualityOfService = .utility 

let exOperation = BlockOperation(block: { 
    //Your URLSessions go here. 
}) 
exOperation.completionBlock = { 
    // A completionBlock if needed 
} 

operationQueue.addOperation(exOperation) 
exOperation.start() 

OperationQueueサブクラスと操作サブクラスを使用するには、あなたが複数のスレッドを処理するための追加のユーティリティを提供します。

+0

ありがとう、Jacob、あなたの提案はこの問題に完全に合っています。 – eduardo

+0

@eduardo - キューに追加するタスクは、それ自体が非同期であるため、それほど単純ではありません。したがって、非同期操作を作成する必要があります。 http://stackoverflow.com/a/40560463/1271826を参照してください。 – Rob