I got the information from Apple by DTS.
The comments are below.
This is a known issue. However, nested run loops are not a recommended practice today due to complexities of timing event loops and the response chain. Could you replace the logic which requires spinning the run loop with a call to performSelector or a timer instead?
So I rewrote the code using "An escaping closure to handle the completion callback with Timer".
It works good, but there was a lot of code changes and the nesting was very deep(In the sense of the caller).
I had no other ideas.
ex)
func delayedDisplay(completion: @escaping () -> Void) {
let partString = moji.prefix(1)
if (moji == "") {
print("<END>")
// 5. Invokes the completion handler when the recursive work ends.
completion()
return
}
print(partString, terminator: "")
// 2. Schedules a single use timer to perform recursion.
_ = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in
// 3. Perform some work.
if let range = self.moji.range(of: partString) {
self.moji.replaceSubrange(range, with: "")
// 4. Passes the completion handler again for proper recursion.
self.delayedDisplay(completion: completion)
}
}
}
Post
Replies
Boosts
Views
Activity
I read Apple's documentation and decided from the explanation of RunLoop, run (), but that is probably a mistake.
I'm calling it in the Main thread.
Technically, I should have used semaphore and DispatchQueue, but I was able to achieve the desired behavior with RunLoop, so I decided to use it.
I was very disappointed・・・・
Thanks
I wasted half a day on the same issue.
My solution is below.
1.Make ipa file by Xcode.
But you choose Product - Achive - Distribute App(Not Select Validation App), and choose App Store Connect - Export.
2.Upload ipa file by "Transporter"
You are able to Validation and Delivery.
Big Sur ver11.1
Xcode 12.4
Transporter Ver1.2.1