Alamofireの新機能で、JSONを解析してtableviewを読み込もうとしているIOSアプリケーションのIOSアプリケーションをフォローしていますが、問題はloadGistsの機能が終了する前にnumberOfRowsInSection Alamofireの連鎖された要求を呼び出すことで、配列を生成してそれに応じてテーブルビューにデータを入れることができます.responseArray関数は非同期呼び出しと呼ばれ、numberOfRowsInSection関数の後に呼び出されます。複数のAlamofireチェーン接続されたリクエストでtableviewを実装する
GitHubAPIManagerクラスがありvar gists: [Gist]!
@IBOutlet var tabelView1: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.tabelView1.delegate = self
self.tabelView1.dataSource = self
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
loadGists()
}
func loadGists() {
GitHubAPIManager.sharedInstance.getPublicGists() { result in
guard result.error == nil else {
print(result.error)
// TODO: display error
return
}
if let fetchedGists = result.value {
self.gists = fetchedGists
}
DispatchQueue.main.async {
self.tableView1.reloadData()
}
}
}
:
class GitHubAPIManager: NSObject {
static let sharedInstance = GitHubAPIManager()
func getPublicGists(completionHandler: (Result<[Gist]>) -> Void) {
Alamofire.request(GistRouter.GetPublic())
.responseArray { (response) in
completionHandler(response.result)
}
}
}
をそしてresponseArrayがある:テーブルビューの場合
public func responseArray<T: ResponseJSONObjectSerializable>(
completionHandler: Response<[T]) -> Self {
let serializer = ResponseSerializer<[T]> { request, response, data, error in
guard error == nil else {
return .Failure(error!)
}
guard let responseData = data else {
let failureReason = "Array could not be serialized because input data was nil."
let error = Error.errorWithCode(.DataSerializationFailed,
failureReason: failureReason)
return .Failure(error)
}
let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
let result = JSONResponseSerializer.serializeResponse(request, response,
responseData, error)
switch result {
case .Success(let value):
let json = SwiftyJSON.JSON(value)
var objects: [T] = []
for (_, item) in json {
if let object = T(json: item) {
objects.append(object)
}
}
return .Success(objects)
case .Failure(let error):
return .Failure(error)
}
}
return response(responseSerializer: serializer, completionHandler: completionHandler)
}
:
func tableView(tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return gists.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let gist = gists[indexPath.row]
cell.textLabel!.text = gist.description
cell.detailTextLabel!.text = gist.ownerLogin
return cell
}
GistRouterは次のとおりです。
enum GistRouter: URLRequestConvertible {
static let baseURLString:String = "https://api.github.com"
case getPublic()
var method: HTTPMethod {
switch self {
case .getPublic:
return .get
}
}
func asURLRequest() throws -> URLRequest {
let result: (path: String, parameters: [String: AnyObject]?) = {
switch self {
case .getPublic:
return ("/gists/public", nil)
}
}()
let URL = Foundation.URL(string: GistRouter.baseURLString)!
var UrlRequest: URLRequest? = URLRequest(url: URL.appendingPathComponent(result.path))
UrlRequest = try URLEncoding.default.encode(UrlRequest!, with: result.parameters)
UrlRequest?.httpMethod = method.rawValue
return UrlRequest!
}
そして要旨クラスは次のとおりです。
class Gist: ResponseJSONObjectSerializable {
var id: String?
var description: String?
var ownerLogin: String?
var ownerAvatarURL: String?
var url: String?
required init(json: SwiftyJSON.JSON) {
self.description = json["description"].string
self.id = json["id"].string
self.ownerLogin = json["owner"]["login"].string
self.ownerAvatarURL = json["owner"]["avatar_url"].string
self.url = json["url"].string
}
required init() {
}
}
私はDispatchQueue.global(QOS:.utility)試してみました:運と異なる方法で.asyncとも せセマフォ= DispatchSemaphore(0値)私は、Alamofireの連鎖要求をすべて最初に行い、次にnumberOfRowsInSectionを呼び出さなければならない、助けてください。
。 – Barns
tableView1を定義しましたが、tableView.reloadData()を要求しています。あなたが実際に完了ハンドラを実行しているかどうかはわかりません。したがって、reloadDataは実行されていません。代わりにAlamo Fireがその処理を実行している間は、Table Viewの通常の動作のみが実行されます。 –
私はtableviewメソッドを追加し、self.tableView1.reloadData()で修正しましたが、GitHubAPIManager.sharedInstance.getPublicGists(){result in ...}のブロック内にあるものと同じものは、numberOfRowsInSectionが呼び出される前に実行されません。 – bcrich