ios - 为什么不调用 dataTask 的完成处理程序?
问题描述
我有这个烦人的问题,我似乎无法解决。我正在尝试调用特定类(称为 BMUserManagementService)中的函数,但由于某种原因,数据任务中的完成处理程序没有执行。方法如下(getProfile):
internal func getProfile(completion: @escaping (Bool?) -> Void) {
guard let url = self.getProfileLogin else {
fatalError("Can't find the URL to get a profile!")
}
print("unwrapped url: \(url)")
let semaphore = DispatchSemaphore (value: 0)
var request = URLRequest(url: URL(string: url)!,timeoutInterval: Double.infinity)
request.addValue("bearer \(self.accessToken ?? "")", forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.httpMethod = "GET"
print("Request built in getProfile")
print(request)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
print("GetProfile - inside the completion block for the data task...")
if error != nil {
//fatalError("Error: \(String(describing: error))")
print("ERROR-A")
return
}
guard let data = data else {
//fatalError("Error encountered while to get a profile. Error: \(String(describing: error))")
print("ERROR-B")
return
}
print(String(data: data, encoding: .utf8)!)
let getProfile = try? JSONDecoder().decode(GetProfile.self, from: data)
if let results = getProfile {
if results.master == true {
self.getProfileId = results.id
completion(true)
}
} else {
completion(false)
}
semaphore.signal()
}
task.resume()
semaphore.wait()
}
我从另一个视图控制器调用这个函数,如下所示:
self.userManagementSvc?.pollUserManagementService(completion: { (status) in
guard let status = status else { return }
if status {
self.userManagementSvc?.getProfile(completion: { (status) in
guard let success = status else { return }
if success {
self.userManagementSvc?.loginWithProfile(completion: { (status) in
guard let success = status else { return }
if success, let accessToken = self.userManagementSvc?.accessToken, let refreshToken = self.userManagementSvc?.refreshToken {
self.accessToken = accessToken
self.refreshToken = refreshToken
self.userManagementSvc?.wasFirstTokenCreated = true
self.videoPlayback.userSettings = self.userSettings
DispatchQueue.main.async {
// Assign the access token with a linked profile ID to appData
self.videoPlayback.appData.jwtAccessToken = self.accessToken
self.videoPlayback.startPlaybackWithContent(vidi: self.bmVidi, content: currentContent, accessToken: self.accessToken, refreshToken: self.refreshToken)
}
}
})
}
})
} else {
DispatchQueue.main.async { BMViewControllerManager.shared.getTopViewController()?.dismiss(animated: true) {
let alert = UIAlertController(title: NSLocalizedString("unableToAuthenticateTitle", comment: ""), message: NSLocalizedString("unableToAuthenticateDescription", comment: ""), preferredStyle: .alert)
let okAction = UIAlertAction(title: NSLocalizedString("okButtonTitle", comment: ""), style: .default) { (_) in
DispatchQueue.main.async { BMViewControllerManager.shared.getTopViewController()?.dismiss(animated: true) {} }
}
alert.addAction(okAction)
DispatchQueue.main.async { BMViewControllerManager.shared.getTopViewController()?.present(alert, animated: true) {} }
} }
}
self.userManagementSvc?.pollingIterationsCount = 0
})
为什么数据任务没有执行?
请指教
解决方案
推荐阅读
- python - 如何解释 ML 训练输出
- r - 按组回归
- macros - 如何使用语法检查变量的度量(名义/序数/比例)?
- java - Java Mapper 接口我如何注入控制多个 DBMS
- java - 当查询结果为空时,如何使调用返回空字符串而不是 NULL 的 SQL 查询的方法?
- c++ - Why dοes this code output 1?
- algorithm - 两个字符串之间公共最长子串的递归解决方案
- theory - Fibers / Coroutines vs Delimited Continuations
- python-3.x - BeautifulSoup ... AttributeError:“NoneType”对象没有属性“文本”
- java - [android][gradle] 我已经更新并阻止了我的 Android Studio 和 gradle,版本 4.8.1