Swift-Alamofire-Completion Handler在我调用函数时不会执行



正如标题所说,我有一个带有以下参数的函数:

typealias Handler = (Swift.Result<Any?, APIErrors>) -> Void
func viewApi (ownerId: String, accessToken: String, completionHandler: @escaping Handler ){
var viewArray: [Information] = [Information]()

let headers: HTTPHeaders = [

.authorization("Bearer (accessToken)")

]

let viewUrl = "(viewTaskUrl)?userId=(ownerId)"

let url = URL(string: viewUrl)
var request = URLRequest(url: url!)

request.method = .get
request.headers = headers

var taskList:[Task] = []

AF.request(request).responseJSON(completionHandler: { (response) in

var holder = Information(id: 0, title: "", description: "", status: "")
switch response.result {

case .success(let data):
do{
if response.response?.statusCode == 200 {
//                        completionHandler(.success("JSON HERE: 
(String(describing: json))"))
let jsonData = try JSONSerialization.data(withJSONObject: data)
let jsonString = String(data: jsonData, encoding: .utf8)

let trySplit = jsonString?.components(separatedBy: ",")

for i in 0...trySplit!.count-1{
if trySplit![i].contains("id"){
let id = trySplit![i].components(separatedBy: ":")[1]
holder.id = Int(id)!
}
if trySplit![i].contains("title"){
let title = trySplit![i].components(separatedBy: ":")[1]
holder.title = title
//                            print("TITLE: (title)")

}

if trySplit![i].contains("description"){
let desc = trySplit![i].components(separatedBy: ":")[1]
holder.description = desc

}

if trySplit![i].contains("status"){
let stat = trySplit![i].components(separatedBy: ":")[1]
let edited = stat.replacingOccurrences(of: "}", with: "")
holder.status = edited

viewArray.append(holder)

}
}
}else{
//                       completionHandler(.failure(.custom(message: "Please check your network connectivity")))
print("Error")
}

}catch{

print(error.localizedDescription)

}

case .failure(let err):
print (err)

}
print("ARRAY: (viewArray)")
for i in 0 ..< viewArray.count {

let task = Task()

let edited = viewArray[i].status.replacingOccurrences(of: "]", with: "")
let new = viewArray[i].title.replacingOccurrences(of: """, with: "")

task.taskName = new
task.id = viewArray[i].id
task.taskStatus = edited
task.taskDescription = viewArray[i].description
task.email = ownerId

taskList.append(task)
}
try! self.realm.write{
self.realm.add(taskList)
}

}).resume()

}

并且该函数运行良好,它通过返回JSON对象并将内容存储在Realm中来完成它需要做的事情,但当我在主ViewController中调用它时,它不会进入completionHandler,并试图将Realm中的内容存储到数组中。即使Realm已填充,它也会返回一个空数组。这是我的ViewController中的调用:

self.APIManager.viewApi(ownerId: self.userId!, accessToken: self.token!) { (result) in
switch result{
case .success(_):
//does not run
print("SUCCESS COMPLETION")
case .failure(let err):
print(err.localizedDescription)
}
}

有没有什么方法可以让函数在执行其余代码之前运行,这样数组就不会为空,并且它实际上会进入我的completionHandler?

p.S.不要介意我存储JSON对象的方式很粗糙,因为除了将其转换为字符串然后剪切它之外,我还必须找到更好的方法将其存储到数组中

尝试这样的方法:

func viewApi (ownerId: String, accessToken: String, completionHandler: @escaping Handler ) {
//...
AF.request(request).responseJSON { response in  // <-- here
//...
completionHandler(.success("JSON HERE:(String(describing: json))"))  // <-- here
//...
}
//...
}

您的处理程序类型是什么?以及为什么完成处理程序没有设置

根据失败、成功示例返回处理程序类型。

self.APIManager.viewApi(ownerId: self.userId!, accessToken: self.token!, completionHandler: CompletionHandler) { (result) in
switch result{
case .success(_):

completionHandler(success:true)
case .failure(let err):
print(err.localizedDescription)
completionHandler(success: false)
}
}

您可以在完成时原样返回原始响应,根据您的要求编写一个助手类来处理json响应

最新更新