标签: urlsession

如何使用 swift 5 URLSession 中引入的新 Result 类型?

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 …

urlsession swift5

4
推荐指数
2
解决办法
5110
查看次数

URLSession.shared.dataTask vs dataTaskPublisher,什么时候使用哪个?

我最近遇到了两个数据获取(下载)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)

ios swift urlsession

3
推荐指数
1
解决办法
662
查看次数

许多任务中的一种方法 async/await

您好,我有一个情况,我需要在多个任务中调用相同的方法。我希望能够一一调用此方法(同步)而不是在并行模式下。看起来像这样:

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。取决于第一个任务被调用。

有任何想法吗?

task grand-central-dispatch async-await swift urlsession

3
推荐指数
1
解决办法
1377
查看次数

Swift - 显示警报时图像颜色重置

所以在我的 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 文件并显示警报请稍等,图像变成灰色,如下所示:

在此处输入图片说明

我不确定一个视图控制器怎么可能改变另一个视图控制器的子视图。提前致谢 - 豪尔赫

uiimage swift urlsession

2
推荐指数
1
解决办法
827
查看次数

URLRequest 和 URL 有什么区别?

我正在使用URLSession下载文件。有两种方法:

downloadTask(with request: URLRequest)
Run Code Online (Sandbox Code Playgroud)

downloadTask(with url: URL).
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?除了POST、PUT之外,简单下载还有什么特别的用处吗?

ios nsurlsessiondownloadtask swift urlsession swift4

2
推荐指数
1
解决办法
3059
查看次数

Swift 中 URLSession 的子类化工厂方法

我正在尝试URLSession在 Swift 中创建一个子类(原因无关紧要,但与测试有关)。我需要它与 adelegate和特定的 一起使用URLSessionConfiguration,这是 上的只读属性URLSessionURLSession使用委托进行初始化的通常方法是使用以下代码完成的,它可以完美地工作:

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)

inheritance initializer factory-method swift urlsession

2
推荐指数
1
解决办法
1031
查看次数

使用Combine,如何在网络请求后取消分配订阅

如果您使用 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)

swift urlsession combine

2
推荐指数
2
解决办法
1391
查看次数

如何使用 Alamofire 处理两个不同的 JSON 响应

我正在 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 处理两个不同的响应?

swift alamofire urlsession

2
推荐指数
1
解决办法
906
查看次数

使用 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)

json swift urlsession

2
推荐指数
1
解决办法
3886
查看次数

如何快速将本地视频转换为base64?

我目前正在研究一种将视频短视频(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 并将其发送到我的发布请求正文中,或者我应该使用其他方式将视频上传到服务器中?我愿意接受任何建议,谢谢

base64 ios video-gallery swift urlsession

2
推荐指数
1
解决办法
2148
查看次数