我正在寻找一个可以链接多个HTTP请求的好模式.我想使用Swift,最好是Alamofire.
比如说,我想做以下事情:
承诺的概念似乎很适合这一点.如果我可以做这样的事情,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本质上是异步的,所以这种模式不是一种选择.
我一直在尝试使用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)
抱怨"额外的争论".
PromiseKit在其网站上声明如下:
我应该关注保留周期吗?
tl; dr:在promise承办人中使用self是安全的.
这很安全:
Run Code Online (Sandbox Code Playgroud)somePromise.then { self.doSomething() }
提供
somePromise
解析后,传递给的函数then
将被释放,因此[weak self]
不需要指定.指定[无主自我]可能很危险.
你告诉我不要担心保留周期?!
不,这只是默认情况下,使用PromiseKit时不会导致保留周期.但它仍有可能......
这是否意味着我永远不应该[weak self]
在PromiseKit块中使用?有没有我还需要使用的情况[weak self]
?它究竟是如何阻止保留周期的?
我正在尝试将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 中的 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) 我是 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) 我在视图控制器中定义了以下代码.
_ = 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请求.
如果用户在呼叫返回之前解除了视图控制器,那么回叫链会发生什么?它是否仍在运行,我认为,它仍然被引用?
我正在寻找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或其他图书馆做到这一点?
好一堆!
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) 这就是我使用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()
?
promisekit ×10
swift ×10
ios ×5
promise ×2
alamofire ×1
asynchronous ×1
ios15 ×1
retain-cycle ×1
swift3 ×1
swift5 ×1
xcode ×1