标签: promisekit

连锁多个Alamofire请求

我正在寻找一个可以链接多个HTTP请求的好模式.我想使用Swift,最好是Alamofire.

比如说,我想做以下事情:

  1. 提出PUT请求
  2. 发出GET请求
  3. 用数据重新加载表

承诺的概念似乎很适合这一点.如果我可以做这样的事情,PromiseKit可能是个不错的选择:

NSURLConnection.promise(
    Alamofire.request(
        Router.Put(url: "http://httbin.org/put")
    )
).then { (request, response, data, error) in
    Alamofire.request(
        Router.Get(url: "http://httbin.org/get")
    )   
}.then { (request, response, data, error) in
    // Process data
}.then { () -> () in
    // Reload table
}
Run Code Online (Sandbox Code Playgroud)

但那是不可能的,或者至少我不知道.

如何在不嵌套多个方法的情况下实现此功能?

我是iOS的新手,所以也许有一些我缺少的基础知识.我在其他框架(如Android)中所做的是在后台进程中执行这些操作并使请求同步.但Alamofire本质上是异步的,所以这种模式不是一种选择.

ios swift alamofire promisekit

46
推荐指数
4
解决办法
3万
查看次数

在Swift中创建一个新的NSError(拒绝来自PromiseKit的Promise)

我一直在尝试使用PromiseKit,而且我坚持拒绝承诺.

承诺拒绝是通过调用带有NSError作为参数的拒绝函数来完成的.

func getAPromise() -> Promise<Bool> {
    return Promise<Bool> { fulfiller, rejecter in
        let diceRoll = Int(arc4random_uniform(7))
        if diceRoll < 4 {
             // rejecter(?) how do I call this rejection correctly ?
        } else {
             fulfiller(true)
        }
}
Run Code Online (Sandbox Code Playgroud)

简单地获取NSError的实例会对我有所帮助.

编辑:

NSError("somedomain", 123, [])
Run Code Online (Sandbox Code Playgroud)

抱怨"额外的争论".

swift promisekit

20
推荐指数
1
解决办法
1万
查看次数

我应该在PromiseKit块中使用[弱自我]吗?

PromiseKit在其网站上声明如下:

我应该关注保留周期吗?

tl; dr:在promise承办人中使用self是安全的.

这很安全:

somePromise.then {
    self.doSomething()
}
Run Code Online (Sandbox Code Playgroud)

提供somePromise解析后,传递给的函数then将被释放,因此[weak self]不需要指定.

指定[无主自我]可能很危险.

你告诉我不要担心保留周期?!

不,这只是默认情况下,使用PromiseKit时不会导致保留周期.但它仍有可能......

这是否意味着我永远不应该[weak self]在PromiseKit块中使用?有没有我还需要使用的情况[weak self]?它究竟是如何阻止保留周期的?

retain-cycle swift promisekit

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

使用Swift的PromiseKit:终止承诺链

我正在尝试将PromiseKit与Swift一起使用.我对它并不熟悉,似乎没有太多关于它与Swift一起使用的信息.

我似乎无法弄清楚如何终止一连串的承诺.只要最后一个(终端)then块包含单个语句,一切都很好:

firstly {
    // ...
}.then { obj in
    self.handleResult(obj)
}.catch { error in
    self.handleError(error)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加另一个语句,编译器会抱怨:

firstly {
    // ...
}.then { obj in
    self.handleResult(obj)
    self.doSomethingDifferent(obj)
}.catch { error in // compiler error: Missing return in a closure expected to return 'AnyPromise'
    self.handleError(error)
}
Run Code Online (Sandbox Code Playgroud)

显然,解决方案是返回另一个承诺,但它在终端块中没有意义.还有什么我可以做的吗?

swift promisekit

9
推荐指数
1
解决办法
5127
查看次数

错误:无法使用 Swift + PromiseKit 将类型 '() -&gt; ()' 的值转换为闭包结果类型 'String'

我是 Swift 中的 Promise 的新手,并使用 PromiseKit 在操场上尝试创建一个非常简单的响应并尝试使用它。我有以下代码:

import UIKit
import PromiseKit

func foo(_ error: Bool) -> Promise<String> {
  return Promise { fulfill, reject in
    if (!error) {
      fulfill("foo")
    } else {
      reject(Error(domain:"", code:1, userInfo:nil))
    }
  }
}

foo(true).then { response -> String in {
  print(response)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

error: MyPlayground.playground:11:40: error: cannot convert value of type '() -> ()' to closure result type 'String'
foo(true).then { response -> String in {
Run Code Online (Sandbox Code Playgroud)

xcode swift promisekit

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

Swift async/await 相当于 Promise Kit“when”模式

我是 Swift 的新手,来自 JS,我已经开始构建一个 iOS 应用程序。

最初,我使用 Promise Kit 来处理异步内容,因为它对我来说比我读到的其他内容更容易。

无论如何,在 JS 中,我经常使用以下模式:

async function doAyncFunction(item) {
  try {
    // do async call to fetch data using item
    return Promise.resolve(data);
  } catch (error) {
    return Promise.reject(error);
  }
}
const promises = items.map((item) => doAyncFunction(item));
const results = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)

我最终通过 Promise Kit 实现了这一点,如下所示:

func doManyAsyncRequests(userIds: [String], accessToken: String) -> Promise<Void> {
  Promise { seal in
    let promises = spotifyUserIds.map {
      doSingleAsyncRequest(userId: $0.id, accessToken: accessToken) // this function returns a promise …
Run Code Online (Sandbox Code Playgroud)

swift promisekit swift5 ios15

7
推荐指数
1
解决办法
3114
查看次数

承诺被抛弃会发生什么?

我在视图控制器中定义了以下代码.

    _ = accountService.getAccount()

      .then { user -> Void in

         self.txtBxUser.text = user.username
         self.txtBxEmail.text = user.email
   }
Run Code Online (Sandbox Code Playgroud)

getAccount 发出REST API请求.

如果用户在呼叫返回之前解除了视图控制器,那么回叫链会发生什么?它是否仍在运行,我认为,它仍然被引用?

asynchronous ios swift promisekit

6
推荐指数
1
解决办法
194
查看次数

Swift&PromiseKit:解决循环中的所有承诺

我正在寻找Swift3中的解决方案来同时解决动态数量的promise,例如像JavaScript中的这个示例:

var promises = [];
for(var i = 0; i < 5; i++) {
    var promise = $http.get('/data' + i);
    promises.push(promise);
}
$q.all(promises).then(doSomethingAfterAllRequests);
Run Code Online (Sandbox Code Playgroud)

https://daveceddia.com/waiting-for-promises-in-a-loop/

有一个库可以为Swift2调用'Craft',可以做到这一点(https://github.com/supertommy/craft),但它不再维护.

有没有人知道我是否或如何使用PromiseKit或其他图书馆做到这一点?

好一堆!

promise ios swift promisekit swift3

6
推荐指数
1
解决办法
3696
查看次数

Swift PromiseKit: Equivalent to when() which executes sequentially?

I'm using PromiseKit with Swift, which has been very handy so far. One of the functions they provide is when(), which allows you to have an array of any number of promises and execute something only once ALL of them have completed.

但是,数组中的承诺是并行执行的。我还没有找到任何允许我按顺序执行它们的函数。我尝试编写自己的递归函数,但它似乎没有按照它们在数组中的顺序执行承诺,而且我偶尔会遇到“承诺已释放”错误。请帮忙!

static func executeSequentially(promises: [Promise<Void>]) -> Promise<Void> {
    return Promise<Void> { fulfil, reject in
        var mutablePromises = promises
        if mutablePromises.count > 0 {
            mutablePromises.first!
                .then { _ -> Promise<Void> in
                    print("DEBUG: \(mutablePromises.count) promises in promise array.")
                    mutablePromises.remove(at: …
Run Code Online (Sandbox Code Playgroud)

ios swift promisekit

6
推荐指数
1
解决办法
984
查看次数

在PromiseKit 6中返回空白

这就是我使用PromiseKit 4.5的原因

api.getUserFirstName().then { name -> Void in
  print(name)
}
Run Code Online (Sandbox Code Playgroud)

getUserFirstName()返回一个Promsise<String>.我更新到PromiseKit 6,现在抛出一个错误: Cannot convert value of type '(_) -> Void' to expected argument type '(_) -> _'

这个错误信息对我来说没什么意义.我该如何解决?

编辑:所以这似乎解决了它,但我对这发生了什么事情几乎一无所知:

api.getUserFirstName().compactMap { name in
  print(name)
}
Run Code Online (Sandbox Code Playgroud)

现在then()和之间的区别是什么compactMap()

promise ios swift promisekit

6
推荐指数
1
解决办法
1695
查看次数

标签 统计

promisekit ×10

swift ×10

ios ×5

promise ×2

alamofire ×1

asynchronous ×1

ios15 ×1

retain-cycle ×1

swift3 ×1

swift5 ×1

xcode ×1