Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash when calling fire() after creating timer #29

Open
BenchR267 opened this issue Jul 22, 2016 · 10 comments
Open

Crash when calling fire() after creating timer #29

BenchR267 opened this issue Jul 22, 2016 · 10 comments

Comments

@BenchR267
Copy link

The following code worked with 1.3.0 but crashes with 1.4.0:

let timer = NSTimer.every(1) { 
            print("do something!")
        }
timer.fire()

The internal refactoring of not using NSTimer initializers might be the problem.

@BenchR267 BenchR267 changed the title Crash when calling fire after creating timer Crash when calling fire() after creating timer Jul 22, 2016
@radex
Copy link
Owner

radex commented Jul 22, 2016

could you give more info? OS version, crash log?

@BenchR267
Copy link
Author

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000043000002

Crashed: com.apple.main-thread
0 libobjc.A.dylib 0x19860dbc8 objc_msgSend + 8
1 CoreFoundation 0x1839f3580 -[__NSCFTimer fire] + 120

This is happening on every device, every OS I tried (iOS, iPhone)

@radex
Copy link
Owner

radex commented Jul 23, 2016

Looks like the CFTimer → NSTimer bridging is lacking, and a bridged timer doesn't actually have a fire() method...

screen shot 2016-07-23 at 08 43 13

It is an edge case, but still worth reverting to the old method of initializing timers...

@BenchR267 Would you mind filing the bug with Apple (bugreport.apple.com), so that it's also fixed for everyone?

@BenchR267
Copy link
Author

Oh yeah, sorry, forgot to answer. I'll create a bugticket at Apple.

@maxkattner
Copy link

@radex Will you revert to the old way anytime soon? Asking because you said you would, but there have been no changes to that.

@radex
Copy link
Owner

radex commented Aug 8, 2016

I intend to… The trouble is that if I do that, I lose compatibility with SwiftPM (old method requires ObjC runtime)... Perhaps a conditional implementation (Using either CFRunLoopTimer API or the new block-based API) would do the job. PRs welcome.

@scisci
Copy link

scisci commented Oct 2, 2016

Is there a workaround for this? Its crashing my app as well.

@BenchR267
Copy link
Author

BenchR267 commented Oct 7, 2016

@scisci we are using an older version of SwiftyTimer which doesn't have the issues.

@Genhain
Copy link

Genhain commented Nov 23, 2017

I also encountered this issue, The context is if the user is about to switch views that if a certain timer that calls a function to hide certain messages has not done so when its about to switch, it fires then invalidates the timer.

So instead of fire() i set the fireDate to now and then have a completion block for any code that needs to happen after the timer has fired (e.g invalidating after firing). If the code after the call is not dependant on the timer firing it does not need to be in the block.

typealias VanillaClosure = () -> Void
@objc(fireNowThen:)
func fire(completionBlock: VanillaClosure?) {
    fireDate = Date()
    MTq.after(0.1) {
        completionBlock?()
    }
}

MTq is a legacy obj-c library, which is just syntax sugar for GCD that could easily be GCD or any other GCD-esque library

@rafaelnobrepd
Copy link

This just got me as well, a bummer!
Luckily in this project I targeted iOS 10, which does have a Timer API that is closer to SwiftyTimer in simplicity and elegance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants