2017-10-26 4 views
0

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を呼び出さなければならない、助けてください。

+0

。 – Barns

+0

tableView1を定義しましたが、tableView.reloadData()を要求しています。あなたが実際に完了ハンドラを実行しているかどうかはわかりません。したがって、reloadDataは実行されていません。代わりにAlamo Fireがその処理を実行している間は、Table Viewの通常の動作のみが実行されます。 –

+0

私はtableviewメソッドを追加し、self.tableView1.reloadData()で修正しましたが、GitHubAPIManager.sharedInstance.getPublicGists(){result in ...}のブロック内にあるものと同じものは、numberOfRowsInSectionが呼び出される前に実行されません。 – bcrich

答えて

0

それはで私のために働い: `numberOfRowsInSection`と` cellForRowAt`のためのあなたの方法を追加してください

var gists = [Gist]() { 
     didSet { 

      self.tabelView1.reloadData() 

     } 
    } 
関連する問題