kenji_otsuka
03/27/2019, 2:23 PMobject WebGateway {
fun get(urlString: String): String {
val semaphore = dispatch_semaphore_create(0)
val components = NSURLComponents(urlString)
val url = components.URL
var result: String = ""
val config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.waitsForConnectivity = true
config.timeoutIntervalForResource = 300.0
val request = NSURLRequest.requestWithURL(url!!)
val session = NSURLSession.sessionWithConfiguration(
config, null, NSOperationQueue.mainQueue()
)
val task =
session.dataTaskWithRequest(request) { nsData: NSData?, nsurlResponse: NSURLResponse?, nsError: NSError? ->
nsData?.run { result = toString() }
println(nsData)
dispatch_semaphore_signal(semaphore);
}
task.resume()
session.finishTasksAndInvalidate()
NSOperationQueue.mainQueue().waitUntilAllOperationsAreFinished()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
return result
}
}
when i execute main.kexe
, any meaningful output doesn't appear but the program doesn't finish.svyatoslav.scherbina
03/27/2019, 2:32 PMNSOperationQueue.mainQueue
won’t run.kenji_otsuka
03/27/2019, 3:02 PMsvyatoslav.scherbina
03/27/2019, 3:15 PMNSApplication
, see e.g. https://github.com/JetBrains/kotlin-native/blob/31892bd82eee7995db1f0524401242ffb624f446/samples/objc/src/objcMain/kotlin/Window.kt#L30
Alternatively you can run main event loop manually, please refer to the documentation.kenji_otsuka
03/28/2019, 5:18 AMfun main(args: Array<String>) {
autoreleasepool {
val app = NSApplication.sharedApplication()
app.delegate = MyAppDelegate()
app.setActivationPolicy(NSApplicationActivationPolicy.NSApplicationActivationPolicyRegular)
app.activateIgnoringOtherApps(true)
app.run()
}
}
private class MyAppDelegate() : NSObject(), NSApplicationDelegateProtocol {
fun get(urlString: String): String {
val semaphore = dispatch_semaphore_create(0)
val components = NSURLComponents(urlString)
val url = components.URL
var result: String = ""
val config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.waitsForConnectivity = true
config.timeoutIntervalForResource = 300.0
val request = NSURLRequest.requestWithURL(url!!)
val session = NSURLSession.sessionWithConfiguration(
config, null, NSOperationQueue.mainQueue()
)
val task =
session.dataTaskWithRequest(request) { nsData: NSData?, nsurlResponse: NSURLResponse?, nsError: NSError? ->
nsData?.run { result = WebGateway.toString() }
println(nsData)
dispatch_semaphore_signal(semaphore);
}
task.resume()
session.finishTasksAndInvalidate()
NSOperationQueue.mainQueue().waitUntilAllOperationsAreFinished()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
return result
}
init {
println(get("<https://www.google.com/>"))
}
}
svyatoslav.scherbina
03/28/2019, 7:31 AMNSOperationQueue.mainQueue().waitUntilAllOperationsAreFinished()
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
This code is executed on main queue too, so your data task completion handler can’t start before you return.