It's safe in the sense that, while multiple copies of the block may run concurrently, they're all working on different objects. Assuming that your call to setValue:forKey:
doesn't have side effects on other objects in the collection, of course.
It's not safe in the sense that if another thread or queue attempts to access the objects in this collection, there's nothing to stop it from messing with the same object at the same time. The block doesn't lock out other actions in other places, so if you might be using these objects somewhere else at the same time, you'll need more precautions.