我创建了一个Alamofire路由器来管理我的所有API调用,如下所示 -
enum Router: URLRequestConvertible {
static let baseURLString = "http://testapi.silive.in/api/"
case getAll()
func asURLRequest() throws -> URLRequest {
var method: HTTPMethod {
switch self {
case .getAll():
return .get
}
}
let url: URL = {
let relativePath: String
switch self {
case .getAll():
relativePath = "get_list_"
}
var url = URL(string: Router.baseURLString)
url?.appendPathComponent(relativePath)
return url!
}()
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = method.rawValue
let encoding = JSONEncoding.default
return try encoding.encode(urlRequest, with: nil)
}
}
class APIManager {
static let sharedInstance = APIManager()
func getAllPapers() {
Alamofire.request(Router.getAll()).responseString {
response in
if let recievedString = response.result.value {
print(recievedString)
}
}
}
}
现在在我的视图控制器的viewDidLoad
方法中,我想调用APIManager.sharedInstance.getAllPapers()
,并且在请求执行时需要显示活动指示符。
问题是我可以在调用方法之前启动活动指示器,但是如何停止指示器。 Alamofire请求的完成块无法访问VC中存在的activityIndicator。
答案 0 :(得分:1)
您可以在getAllPapers方法中创建ApiManagerDelegate / Notification或完成处理程序
编辑: 完成处理程序的示例:
typealias Response = (String?) -> Void
class APIManager {
static let sharedInstance = APIManager()
func getAllPapers(completionHandler: Response) {
Alamofire.request(Router.getAll()).responseString {
response in
if let recievedString = response.result.value {
completionHandler(recievedString)
} else {
completionHandler(nil)
}
}
}
}
现在你可以像这样使用它了
APIManager.sharedInstance.getAllPapers {
(response) in
print(response)
self.activityIndicator .....
}