Sychronous wrapper around UIApplication.openURL:options:completion:
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
0
down vote
favorite
I am deprecating iOS 9 on a project. One of the differences in the framework is that the openURL method has changed.
iOS 9
- (BOOL)openURL:(NSURL *)url;
iOS 10
- (void)openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
Notice how the method changed from being synchronous to asynchronous.
Since I have a bunch of usages for the synchronous method, I want to create a synchronous wrapper around the asynchronous openURL:options:completion:
method and I'm going to update the usages to call this asynchronous wrapper instead.
My first attempt looks like this:
- (BOOL)sync_openURL: (nullable NSURL *)url
__block BOOL result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self openURL:url options:@ completionHandler:^(BOOL success)
result = success;
dispatch_semaphore_signal(semaphore);
];
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
return result;
Is this a good replacement ? Can it be improved in anyway ?
objective-c ios
add a comment |Â
up vote
0
down vote
favorite
I am deprecating iOS 9 on a project. One of the differences in the framework is that the openURL method has changed.
iOS 9
- (BOOL)openURL:(NSURL *)url;
iOS 10
- (void)openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
Notice how the method changed from being synchronous to asynchronous.
Since I have a bunch of usages for the synchronous method, I want to create a synchronous wrapper around the asynchronous openURL:options:completion:
method and I'm going to update the usages to call this asynchronous wrapper instead.
My first attempt looks like this:
- (BOOL)sync_openURL: (nullable NSURL *)url
__block BOOL result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self openURL:url options:@ completionHandler:^(BOOL success)
result = success;
dispatch_semaphore_signal(semaphore);
];
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
return result;
Is this a good replacement ? Can it be improved in anyway ?
objective-c ios
1
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08
add a comment |Â
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am deprecating iOS 9 on a project. One of the differences in the framework is that the openURL method has changed.
iOS 9
- (BOOL)openURL:(NSURL *)url;
iOS 10
- (void)openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
Notice how the method changed from being synchronous to asynchronous.
Since I have a bunch of usages for the synchronous method, I want to create a synchronous wrapper around the asynchronous openURL:options:completion:
method and I'm going to update the usages to call this asynchronous wrapper instead.
My first attempt looks like this:
- (BOOL)sync_openURL: (nullable NSURL *)url
__block BOOL result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self openURL:url options:@ completionHandler:^(BOOL success)
result = success;
dispatch_semaphore_signal(semaphore);
];
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
return result;
Is this a good replacement ? Can it be improved in anyway ?
objective-c ios
I am deprecating iOS 9 on a project. One of the differences in the framework is that the openURL method has changed.
iOS 9
- (BOOL)openURL:(NSURL *)url;
iOS 10
- (void)openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
completionHandler:(void (^)(BOOL success))completion;
Notice how the method changed from being synchronous to asynchronous.
Since I have a bunch of usages for the synchronous method, I want to create a synchronous wrapper around the asynchronous openURL:options:completion:
method and I'm going to update the usages to call this asynchronous wrapper instead.
My first attempt looks like this:
- (BOOL)sync_openURL: (nullable NSURL *)url
__block BOOL result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self openURL:url options:@ completionHandler:^(BOOL success)
result = success;
dispatch_semaphore_signal(semaphore);
];
while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW))
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
return result;
Is this a good replacement ? Can it be improved in anyway ?
objective-c ios
asked Feb 8 at 19:15
gprasant
1012
1012
1
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08
add a comment |Â
1
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08
1
1
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08
add a comment |Â
1 Answer
1
active
oldest
votes
up vote
2
down vote
That code should work, but blocking the main thread is never a good idea. That's why the method was changed in the first place.
I suggest a deeper refactor of your code so that you use the new async method with completion handler as intended.
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
add a comment |Â
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
That code should work, but blocking the main thread is never a good idea. That's why the method was changed in the first place.
I suggest a deeper refactor of your code so that you use the new async method with completion handler as intended.
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
add a comment |Â
up vote
2
down vote
That code should work, but blocking the main thread is never a good idea. That's why the method was changed in the first place.
I suggest a deeper refactor of your code so that you use the new async method with completion handler as intended.
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
add a comment |Â
up vote
2
down vote
up vote
2
down vote
That code should work, but blocking the main thread is never a good idea. That's why the method was changed in the first place.
I suggest a deeper refactor of your code so that you use the new async method with completion handler as intended.
That code should work, but blocking the main thread is never a good idea. That's why the method was changed in the first place.
I suggest a deeper refactor of your code so that you use the new async method with completion handler as intended.
answered Feb 20 at 14:41
Duncan C
1712
1712
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
add a comment |Â
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
+1 blocking the main thread like that is a terrible idea
â trapper
May 29 at 1:02
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f187112%2fsychronous-wrapper-around-uiapplication-openurloptionscompletion%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
1
Why don't you want to make your code asynchronous?
â Roman Podymov
Feb 20 at 13:08