2016-11-09 125 views
-1

我想做一个网络爬行,目前我正在阅读12000个URL的txt文件,我想在这个过程中使用并发,但请求不起作用。如何在swift中同步异步HTTP请求3,没有AlamoFire

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正常工作,你需要去为创建单独的OperationQueue创建为每个你想完成你的异步任务的Operation,将其添加到您的操作队列,并设置OperationQueue的maxConcurrentOperationCount到控制一次可以运行多少个任务。 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子类和Operation子类将为您提供用于处理多个线程的其他实用程序。

+0

谢谢雅各布,你的建议非常适合这个问题。 – eduardo

+0

@eduardo - 这并不是那么简单,因为您要添加到队列中的这些任务本身就是异步的。所以你必须创建异步操作。请参阅http://stackoverflow.com/a/40560463/1271826。 – Rob