Delaying iterations of a for loop

I have been struggling with this for awhile. I have a for loop which is creating an group of SKSpriteNodes and giving them physics etc. This seems to be causing a lag in gameplay when this loop is run. I have successfully delayed the actual adding of the spriteNodes but this doesn't seem to help with the lag issue. I would like to be able to have the for loop run once, wait for a bit of time, then run the next iteration. Is this possible?

func delay(_ delay:Double, closure:@escaping ()->()) {
    let when = + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure)

func createRoadImages() {
    for (index, roadImage) in imageArrays.enumerated() {
        let roadSprite = SKSpriteNode(imageNamed: roadImage)
        roadSprite.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        roadSprite.position = CGPoint(x: 0, y: CGFloat(screenCounter) * roadSprite.size.height)
        roadSprite.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
        roadSprite.physicsBody?.friction = roadFriction
        roadSprite.physicsBody?.mass = backgroundMass
        roadSprite.physicsBody?.linearDamping = damping
        roadSprite.physicsBody?.categoryBitMask = PhysicsCategory.RoadImageCategory.rawValue
        roadSprite.physicsBody?.collisionBitMask = PhysicsCategory.NoCollisionsCategory.rawValue
        roadSprite.physicsBody?.contactTestBitMask = PhysicsCategory.BroomCategory.rawValue
        roadSprite.physicsBody?.affectedByGravity = false
        roadSprite.physicsBody?.isDynamic = true

        roadSprite.zPosition = 1 = "Road \(index)"

        delay(delayFor * Double(index)) {
            print("Sprite added \(index)")