When working with physical engines, deceleration is often expected. They are not ideal, especially in more complex scenarios, such as restrictions. You should not rely on the Sprite Kit to provide perfect simulation of continuous movement, because we do not know what the physical engine does under the hood; so many factors.
In cases where you need continuous movement (especially something like constant centripetal movement), it is always best to calculate and save these values โโyourself. It just simply fails to perform the calculations in your update method for these types of behavior.
So, I wrote a quick sample project that calculates the necessary speed necessary for the orbit of a certain point. You simply indicate the period, the position of the orbit, and the radius of the orbit. Note that since I am calculating everything, there is no need for SKJoints , so this implementation will also be easier. I highly recommend you make your orbit this way, as it gives you complete control over how you want your nodes to rotate around each other (i.e. you could have nodal orbital moving nodes, you could have oval motion paths, you could adjust the orbit while pressing the key moments in your game, etc.)
import SpriteKit class GameScene: SKScene { var node1: SKShapeNode! var node2: SKShapeNode! var node2AngularDistance: CGFloat = 0 override func didMoveToView(view: SKView) { physicsWorld.gravity = CGVector(dx: 0, dy: 0) node1 = SKShapeNode(circleOfRadius: 10) node1.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) node1.physicsBody = SKPhysicsBody(circleOfRadius: 10) node2 = SKShapeNode(circleOfRadius: 10) node2.position = CGPoint(x: self.size.width/2.0+50, y: self.size.height/2.0) node2.physicsBody = SKPhysicsBody(circleOfRadius: 10) self.addChild(node1) self.addChild(node2) } override func update(currentTime: NSTimeInterval) { let dt: CGFloat = 1.0/60.0
Below is a gif showing centripetal movement. Note that since it is fully dynamic, we can actually move the centripetal point as it rotates.

If you really want to use the current SKJoints implementation for some reason, then I have another solution for you. Just keep updating the linear speed of the node so that it never slows down.
override func update(currentTime: NSTimeInterval) { let magnitude = sqrt(secondNode.physicsBody!.velocity.dx*secondNode.physicsBody!.velocity.dx+secondNode.physicsBody!.velocity.dy*secondNode.physicsBody!.velocity.dy) let angle = Float(atan2(secondNode.physicsBody!.velocity.dy, secondNode.physicsBody!.velocity.dx)) if magnitude < 500 { secondNode.physicsBody!.velocity = CGVector(dx: CGFloat(cosf(angle)*500), dy: CGFloat(sinf(angle)*500)) } }
Regardless of the solution you choose (and again I highly recommend the first solution!), You can use speed over time, rather than instantly, for a more realistic effect. I will talk more about this in my answer here.
I hope I have provided you with enough information to solve your problem. Let me know if you have any questions. And lucky with your game!