如果创建了多个会话,如何停止当前URLSession



大家好,大家都知道swift,

我正在Swift中创建一个连接到React Native的模块。从react native我调用一个函数,该函数将返回状态代码(如果找到(。

//React Native code
NativeModules.Testing.testURL("MyURL", (result) => { //do some stuff with result });

这一切都很完美,我可以多次调用这个函数(每次传递不同的URL(。我现在试图实现的是停止本届会议。

我知道我可以使用:

//Swift code
session.invalidateAndCancel()

但是我怎么知道当前哪个会话需要停止呢?例如,在react native中,我有一个5个不同网站的列表。我点击每个列表项(网站(,它会创建一个新的会话(假设需要10秒才能获取该网站(。如果我想在返回结果之前停止第3次会话,我该怎么做?有没有一种方法可以从react native跟踪当前会话?

基本上在react原生点击网站>在返回结果之前>在react native中再次单击以停止该会话。

任何帮助都将不胜感激。谢谢

//swift Code
@objc(Testing)
class Testing: NSObject {
@objc func testURL(_ tempUrl: NSString, callback: @escaping RCTResponseSenderBlock) {
func checkURL (url: String, completion: @escaping ((Int) -> Void)){

guard let url = URL(string: url) else{
return
}

let session = URLSession.init(delegate: nil, delegateQueue: OperationQueue.current)

session.dataTask(with: url) { (data, response, err) in

if err != nil {
completion(404)
return
}

if data == nil {
completion(404)
return
}

let httpResponse = response as? HTTPURLResponse
if httpResponse?.statusCode != 200 {
completion(httpResponse!.statusCode)
} else {
completion(httpResponse!.statusCode)
} 
}.resume()
};
checkURL( url: tempUrl as! String, completion: { isSuccess in
//Callback sends response back to react native after above session task has finished
callback([isSuccess])
});
}
}

您需要添加一些特定的逻辑来实现这一点。如果它适合您,您可以扩展以下想法。换怎么样

@objc func testURL(_ tempUrl: NSString, callback: @escaping RCTResponseSenderBlock)

包括您以后可以用来取消的内容,例如

@objc func testURL(_ tempUrl: NSString, index: Int, callback: @escaping RCTResponseSenderBlock) {

然后使用它来检查取消,例如在dataTask内部更改为

if err != nil {
completion(404)
return
}

if data == nil {
completion(404)
return
}
// New stuff
if mustCancel( index: index ) {
completion(xxx)
return
}    
let httpResponse = response as? HTTPURLResponse
// More new stuff
if mustCancel( index: index ) {
completion(xxx)
return
}    
if httpResponse?.statusCode != 200 {
completion(httpResponse!.statusCode)
} else {
completion(httpResponse!.statusCode)
} 

在这里,您需要想出适合xxx的东西(例如409?(。然后,您还需要实现mustCancel函数,在该函数中,您需要决定是否要取消与index关联的URL。见鬼,如果可以的话,你可以让mustCancel也把URL作为参数。

EDIT当然,如果您需要以静默方式取消,请不要在此处调用completion(xxx)

请注意,由于您正在处理并发访问,您可能需要同步对mustCancel中变量的访问,特别是如果那里的逻辑使用mustCancel之外的变量,这些变量可以在其他地方和不同的线程上设置。我不会对此进行过多的阐述,但如果你遵循这一步骤,请小心。

最新更新