我正在寻找一个可以链接多个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