Guest User

Untitled

a guest
May 20th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. class DataManager {
  2. func fetchRoutes(placemarks: [MKPlacemark], placemark: MKPlacemark, completeBlock: @escaping ([DirectionsModel])->()) {
  3. let queue = OperationQueue()
  4. queue.name = "Fetch Routes"
  5.  
  6. var directionsModels = [DirectionsModel]()
  7. if placemarks.count == 0 {
  8. completeBlock(directionsModels)
  9. return
  10. }
  11.  
  12. let callbackFinishOperation = BlockOperation {
  13. print("completeBlock")
  14. completeBlock(directionsModels)
  15. }
  16.  
  17. for oldPlacemark in placemarks {
  18. for tuple in [(oldPlacemark, placemark), (placemark, oldPlacemark)] {
  19. let source = tuple.0
  20. let destination = tuple.1
  21. CountdownManager.shared.countTimes += 1
  22.  
  23. let blockOperation = BlockOperation(block: {
  24. let semaphore = DispatchSemaphore(value: 0)
  25. print("calculate")
  26. MapMananger.calculateDirections(from: source, to: destination, completion: { (status) in
  27. switch status {
  28. case .success(let response):
  29. let directions = DirectionsModel(source: source, destination: destination, routes: response.routes)
  30. directionsModels.append(directions)
  31. print(directions)
  32. case .failure(let error):
  33. print(error)
  34. }
  35. print("semaphore.signal")
  36. semaphore.signal()
  37. })
  38.  
  39. print("semaphore.wait")
  40. semaphore.wait()
  41. print("over")
  42. })
  43.  
  44. print("queue.addOperation")
  45. callbackFinishOperation.addDependency(blockOperation)
  46. queue.addOperation(blockOperation)
  47. }
  48. }
  49.  
  50. print("waitUntilAllOperationsAreFinished")
  51. queue.addOperation(callbackFinishOperation)
  52. queue.waitUntilAllOperationsAreFinished()
  53. }
  54. }
  55.  
  56. class MapMananger {
  57. enum DirectResponseStatus {
  58. case success(MKDirectionsResponse)
  59. case failure(Error)
  60. }
  61.  
  62. class func calculateDirections(from source: MKPlacemark, to destination: MKPlacemark, completion: @escaping (_ status: DirectResponseStatus) -> ()) {
  63.  
  64. let request = MKDirectionsRequest()
  65. request.source = source.toMapItem
  66. request.destination = destination.toMapItem
  67. request.transportType = .automobile
  68. print("MKDirectionsRequest")
  69.  
  70. let directions = MKDirections(request: request)
  71. print("MKDirections")
  72. directions.calculate { (response, error) in
  73. if let response = response {
  74. completion(.success(response))
  75. }
  76.  
  77. if let error = error {
  78. completion(.failure(error))
  79. }
  80. }
  81. }
Add Comment
Please, Sign In to add comment