【发布时间】:2016-07-24 14:25:31
【问题描述】:
我对 Swift 和编程完全陌生。我非常热衷于学习所有正确的方法。因此,任何额外的提示或评论都将受到赞赏。
我正在向 api 发出 HTTP 请求,效果很好。问题是每个请求限制为 100 个结果。我可以设置一个可选的偏移量和一个限制。如果我给出 101 的限制,我会收到服务器错误消息:“错误请求:为限制指定的值无效。允许的最大值为 100。”总数是 101,所以我至少需要做两个请求。只有在收到所有请求的总数据后,我才想填充我的 tableview。这就是我所拥有的:
class Book {
var id: Int
var title: String
let description: String
var coverImage: String
var isbn: String
var publisherID: Int
var publisherName: String
var authorID: Int
var authorFirstName: String
var authorLastName: String
class func getDataFromJson(completionHandler: ([Book]) -> ()) {
var books = [Book]()
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let request = NSURLRequest(URL: NSURL(string: "http://example.website.nl/books/highlighted")!)
let task: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) -> Void in
if let data = data {
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
if let booksFromResult = json["books"] as? [[String: AnyObject]] {
for book in booksFromResult {
let bookID = book["id"] as! Int
let bookTitle = book["title"] as! String
let bookDescription = book["description"] as! String
let bookCoverImage = book["cover_url"] as! String
let bookISBN = book["isbn"] as! String
if let bookPublisher = book["publisher"] as? [String: AnyObject] {
let bookPublisherID = bookPublisher["id"] as! Int
let bookPublisherName = bookPublisher["name"] as! String
if let bookAuthor = book["author"] as? [String: AnyObject] {
let bookAuthorID = bookAuthor["id"] as! Int
let bookAuthorFirstname = bookAuthor["first_name"] as! String
let bookAuthorLastName = bookAuthor["last_name"] as! String
books.append(Book(id: bookID, title: bookTitle, description: bookDescription, coverImage: bookCoverImage, isbn: bookISBN, publisherID: bookPublisherID, publisherName: bookPublisherName, authorID: bookAuthorID, authorFirstName: bookAuthorFirstname, authorLastName: bookAuthorLastName))
}
}
}
print(books.count)
}
dispatch_async(dispatch_get_main_queue(),{
completionHandler(books)
})
} catch {
print("error serializing JSON: \(error)")
}
}
}
task.resume()
}
init(id: Int, title: String, description: String, coverImage: String, isbn: String, publisherID: Int, publisherName: String, authorID: Int, authorFirstName: String, authorLastName: String) {
self.id = id
self.title = title
self.description = description
self.coverImage = coverImage
self.isbn = isbn
self.publisherID = publisherID
self.publisherName = publisherName
self.authorID = authorID
self.authorFirstName = authorFirstName
self.authorLastName = authorLastName
}
}
我已经尝试解决这个问题超过 24 小时。我真的在这里和网上搜索过一个例子。我在这里找到的小东西帮不了我。
我的想法是如何做到这一点:
- 发出第一个请求 -> 将数据存储在某处
- 发出第二个请求 -> 将数据添加到存储的数据中
- 发出最后一个请求 -> 将数据添加到存储的数据中
- 发送数据以填充表格视图。
我是否应该使用 url 数组并进行迭代 通过它而不是将数据附加到某个地方?
我希望有人可以帮助我。我真的很感激。
提前致谢。
【问题讨论】:
-
您说“问题是每个请求限制为 50 个。”但目前尚不清楚这意味着什么。什么限制了对 50 个项目的响应?服务器代码?那么你应该如何申请下一批 50 件商品呢?是否有明确的协议来找出请求的总项目数,然后请求 50 个结果的批次?
-
嗨,邓肯,抱歉不清楚,他们称之为可选的偏移和限制。当我收到批次时,我看到限制为 50,并且还有一个值总计为 101。
-
@Duncan,你让我以另一种方式思考。我可能没看懂解释。限制是 100,但我需要拿回 101。如果我给出 101 的限制,我会收到服务器错误消息:“错误请求:为
limit指定的值无效。允许的最大值为 100。” -
好的,您需要编辑您的问题以显示附加信息。听起来您需要询问服务器它们的总条目数,然后如果结果> 50,则编写代码以一次循环请求 50 个,然后每次收到前 50 个时发送一个新请求.
-
@Duncan,我编辑了这个问题,谢谢。我已经取回了总条目,即 101。我确实理解一个接一个地执行请求的逻辑。我不明白他们是怎么做的。谢谢。
标签: ios swift httprequest