我有一个TableView和自定义单元格。在我的自定义单元格中,我有这个功能:
func URLRequest(bookId : String) {
let headers = [
"Authorization": "Bearer",
"Accept": "application/json"
]
let url = "http://example.com/api/v1/books/\(bookId)/related"
let URLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
URLRequest.cachePolicy = NSURLRequestCachePolicy.ReturnCacheDataElseLoad
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
Alamofire.request(.GET, url, headers:headers)
.validate()
.responseJSON { response in
switch response.result {
case .Success:
if let jsonData = response.result.value {
dispatch_async(dispatch_get_main_queue(), {
print("Custom Cell")
return
})
self.tableRefresh()
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
}
case .Failure(let error):
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
print(error)
}
}
}
我在tableView中运行此函数:
if indexPath.row == 4 {
let cell = tableView.dequeueReusableCellWithIdentifier("relatedCell", forIndexPath: indexPath) as! RelatedBookTableViewCell
cell.URLRequest(self.bookID)
return cell
}
但问题是我每次滚动表视图时此请求(URLRequest)再次运行。我希望一次发送此请求,并在视图加载时发送。
我的问题在哪里?
P.S我尝试使用此
在自定义单元格中加载我的URLRequestoverride init()
但我无法将bookId值从tableview传递到自定义单元格并返回nil。
感谢
答案 0 :(得分:2)
您正面临的问题正在发生,因为表格视图单元格被表格视图重复使用。这意味着操作系统只在内存中保留很少的单元格,但是当您滚动时,它会在视图中移动它们。
无论如何,有两种方法可以解决这个问题:
第一个涉及在表视图控制器中使用书信息(使用字典或数组),当您初始化单元格时,只需在单元格中设置属性即可。的优选强>
第二个是将当前bookId存储在单元格中,如果单元格当前正在显示该书籍ID,则返回。 不建议这样做。
请记住,单元格不是控制器,它应该只用于存储数据和修改视图。所有逻辑都应该在表视图控制器中。
答案 1 :(得分:1)
问题是你试图在你的手机中加载它。每次当您滚动到新单元格时,cellForRowAtIndexPath
都会再次呼叫您的URLRequest
。
你真正需要做的是,之前预先加载你的数据。换句话说,您必须在viewDidLoad
(或特定模型类)中的viewController
上的某处执行请求,将结果存储在数组(或任何其他集合类型)中,然后将静态数据传递到细胞。
在UITableViewCell
子类内调用网络请求将导致内存和流量使用效率低下。
答案 2 :(得分:0)
将table.dequeReusableCellWithIdentifier放在if条件
旁边并像这样写
ul ul li:first