Sychronous wrapper around UIApplication.openURL:options:completion:

The name of the pictureThe name of the pictureThe name of the pictureClash 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 ?







share|improve this question















  • 1




    Why don't you want to make your code asynchronous?
    – Roman Podymov
    Feb 20 at 13:08

















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 ?







share|improve this question















  • 1




    Why don't you want to make your code asynchronous?
    – Roman Podymov
    Feb 20 at 13:08













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 ?







share|improve this question











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 ?









share|improve this question










share|improve this question




share|improve this question









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













  • 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











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.






share|improve this answer





















  • +1 blocking the main thread like that is a terrible idea
    – trapper
    May 29 at 1:02










Your Answer




StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");

StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: false,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);








 

draft saved


draft discarded


















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






























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.






share|improve this answer





















  • +1 blocking the main thread like that is a terrible idea
    – trapper
    May 29 at 1:02














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.






share|improve this answer





















  • +1 blocking the main thread like that is a terrible idea
    – trapper
    May 29 at 1:02












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.






share|improve this answer













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.







share|improve this answer













share|improve this answer



share|improve this answer











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
















  • +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












 

draft saved


draft discarded


























 


draft saved


draft discarded














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













































































Popular posts from this blog

Greedy Best First Search implementation in Rust

Function to Return a JSON Like Objects Using VBA Collections and Arrays

C++11 CLH Lock Implementation