Swift 5 引入了新的 Result 类型来处理异步函数的结果。我想知道如何将这种新的结果类型用于 URLSession。
我有以下代码。
func getCategorByAPI()
{
//Base Url is from an static variable
let url = URL(string: URLManager.aPIBaseURL+"category")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
let boundary = "Boundary-\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
if error != nil {
//print("error=\(error)")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
print(json)
}catch
{
print(error)
}
}
task.resume()
}
Run Code Online (Sandbox Code Playgroud)
如何使用 swift …
我最近遇到了两个数据获取(下载)API,它们对我执行看似相同的事情。我不知道什么时候应该使用一个而不是另一个。
我可以用 URLSession.shared.dataTask
var tasks: [URLSessionDataTask] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
let task = URLSession.shared.dataTask(with: tuple.imageURL, completionHandler :
{ data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() { [weak self] in
self?.displayFlag(data: data, title: tuple.name)
}
})
tasks.append(task)
task.resume()
}
deinit {
tasks.forEach {
$0.cancel()
}
}
Run Code Online (Sandbox Code Playgroud)
或者我可以使用 URLSession.shared.dataTaskPublisher
var cancellables: [AnyCancellable] = []
func loadItems(tuple : (name : String, imageURL : URL)) { …Run Code Online (Sandbox Code Playgroud) 您好,我有一个情况,我需要在多个任务中调用相同的方法。我希望能够一一调用此方法(同步)而不是在并行模式下。看起来像这样:
var isReadyToRefresh: Bool = true
func refresh(value: Int) async {
try! await Task.sleep(nanoseconds: 100_000_000) // imitation API CALL
isReadyToRefresh = false
print("Try to refresh: \(value)")
}
func mockCallAPI(value: Int) async {
if isReadyToRefresh {
await refresh(value: value)
}
}
Task {
await mockCallAPI(value: 1)
}
Task {
await mockCallAPI(value: 2)
}
Run Code Online (Sandbox Code Playgroud)
输出:
尝试刷新:1
尝试刷新:2
我所需的输出:
尝试刷新:1 或尝试刷新 2。取决于第一个任务被调用。
有任何想法吗?
所以在我的 iOS 应用程序中,我有一个这样设计的菜单:
使用以下代码创建图像:
cell.imageCell?.image = menuItems[indexPath.row].image
cell.imageCell.image = cell.imageCell.image?.withRenderingMode(.alwaysTemplate)
cell.imageCell.tintColor = MenuTableViewController.fontColor
cell.imageCell.backgroundColor = UIColor.clear
Run Code Online (Sandbox Code Playgroud)
此代码放置在 tableview cellForRowAt 函数中。现在所有不同的视图控制器(HomeViewController、InfoViewController 等...)根本无法访问菜单控制器,因此无法更改图像的颜色,我也无法在其他任何地方更改这些图像的颜色。现在,当我按下不使用任何警报或模式视图(如主页或信息)的选项卡之一时,图像保持完美,但是当我按下天气或短途旅行时,它们会下载带有 URLSession dataTask 的 json 文件并显示警报请稍等,图像变成灰色,如下所示:
我不确定一个视图控制器怎么可能改变另一个视图控制器的子视图。提前致谢 - 豪尔赫
我正在使用URLSession下载文件。有两种方法:
downloadTask(with request: URLRequest)
Run Code Online (Sandbox Code Playgroud)
和
downloadTask(with url: URL).
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?除了POST、PUT之外,简单下载还有什么特别的用处吗?
我正在尝试URLSession在 Swift 中创建一个子类(原因无关紧要,但与测试有关)。我需要它与 adelegate和特定的 一起使用URLSessionConfiguration,这是 上的只读属性URLSession。URLSession使用委托进行初始化的通常方法是使用以下代码完成的,它可以完美地工作:
let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个子类:
class MyURLSession : URLSession {}
let session = MyURLSession(configuration:
URLSessionConfiguration.default, delegate: nil, delegateQueue: nil) // Compile error
Run Code Online (Sandbox Code Playgroud)
初始化程序触发下一个编译错误:
error: argument passed to call that takes no arguments
根据 Swift Language Guide rule 1 for Automatic Initializer Inheritance:
If your subclass doesn’t define any designated initializers, it
automatically inherits all of its superclass designated …Run Code Online (Sandbox Code Playgroud) 如果您使用 Combine 用于网络请求URLSession,那么您需要保存Subscription(又名AnyCancellable) - 否则它会立即解除分配,从而取消网络请求。稍后,当网络响应被处理后,您想要取消分配订阅,因为保留它会浪费内存。
下面是一些执行此操作的代码。这有点尴尬,甚至可能不正确。我可以想象一个竞争条件,其中网络请求可以在sub设置为非零值之前在另一个线程上开始和完成。
有没有更好的方法来做到这一点?
class SomeThing {
var subs = Set<AnyCancellable>()
func sendNetworkRequest() {
var request: URLRequest = ...
var sub: AnyCancellable? = nil
sub = URLSession.shared.dataTaskPublisher(for: request)
.map(\.data)
.decode(type: MyResponse.self, decoder: JSONDecoder())
.sink(
receiveCompletion: { completion in
self.subs.remove(sub!)
},
receiveValue: { response in ... }
}
subs.insert(sub!)
Run Code Online (Sandbox Code Playgroud) 我正在 SwiftUI 应用程序中创建登录功能。登录成功后,JSON 响应为:
{
"user_id": 41,
"token": "Token",
"token_type": "bearer",
"expires_in": 12096000
}
Run Code Online (Sandbox Code Playgroud)
当登录失败时,JSON 响应为:
{
"message": "this is a failure message"
}
Run Code Online (Sandbox Code Playgroud)
我制作了两个不同的结构来对响应进行编码
struct LoginResponseModelFailure:Codable {
let message:String
}
struct LoginResponseModelSuccess:Codable{
let user_id: Int
let token: String
let token_type : String
let expires_in: Int
}
Run Code Online (Sandbox Code Playgroud)
我需要将这两个结构合并为一个吗?如果是这样怎么办?如何使用 alamofire 或 urlSession 处理两个不同的响应?
我正在尝试从 Unsplash API 获取数据,但收到以下错误:“不允许从后台线程发布更改;请确保在模型更新时从主线程发布值(通过 receive(on:) 等运算符)” ”。
这是模型结构:
// MARK: - UnsplashData
struct UnsplashData: Codable {
let id: String
let createdAt, updatedAt, promotedAt: Date
let width, height: Int
let color, blurHash: String
let unsplashDataDescription: String?
let altDescription: String
let urls: Urls
let links: UnsplashDataLinks
let categories: [String]
let likes: Int
let likedByUser: Bool
let currentUserCollections: [String]
let sponsorship: JSONNull?
let user: User
let exif: Exif
let location: Location
let views, downloads: Int
enum CodingKeys: String, CodingKey {
case id
case …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一种将视频短视频(10-30秒)上传到我的数据库的方法,并询问是否可以将视频从本地图库转换为base64,目前我使用 imagePickerController 获取视频你可以在这段代码中看到:
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
//Here is save the video URL
let url = info[.mediaURL] as? URL
//Here goes the code to convert this video URL to base64...
self.dismiss(animated: true)
}
Run Code Online (Sandbox Code Playgroud)
我还想知道是否可以将视频保存到 Base64 并将其发送到我的发布请求正文中,或者我应该使用其他方式将视频上传到服务器中?我愿意接受任何建议,谢谢
urlsession ×10
swift ×9
ios ×3
alamofire ×1
async-await ×1
base64 ×1
combine ×1
inheritance ×1
initializer ×1
json ×1
swift4 ×1
swift5 ×1
task ×1
uiimage ×1