我正在尝试在json数据更新后重新加载集合视图但遇到错误:
无法指定类型'()'的值来键入'[ChannelInfo]'
这就是我如何设置自定义对象'ChannelInfo':
class ChannelInfo: NSObject {
var logo: String?
var channelName: String?
var id: NSNumber?
init(logo: String, channelName: String , id: NSNumber) {
self.logo = logo
self.channelName = channelName
self.id = id
}
init(resDictionary: [String:Any]) {
logo = resDictionary["artwork_608x342"] as? String
channelName = resDictionary["name"] as? String
id = resDictionary["id"] as? NSNumber
}
static func updateAllChannels(completionHandler:@escaping (_ channels: [ChannelInfo]) -> Void){
let nm = NetworkManager.sharedManager// singleton handles network connections and json parsing
nm.getJSONData(urlExtension: "channels/all/0/50", completion: {
data in
var channels = [ChannelInfo]()
if let jsonDictionary = nm.parseJSONFromData(data)
{
let resultsDictionaries = jsonDictionary["results"] as! [[String : Any]]
for resultsDictionary in resultsDictionaries {// enumerate through dictionary
let newChannel = ChannelInfo(resDictionary: resultsDictionary)
channels.append(newChannel)
}
}
completionHandler(channels)
})
}
}
这是我在更新json对象后重新加载集合视图的方法:
var channelArray: [ChannelInfo] = []
override func viewDidLoad() {
channelArray = ChannelInfo.updateAllChannels(completionHandler: { _ in
self.channelCollectionView.reloadData()
})//Error happens here starting with 'channelArray'
}
我觉得我可能错过了一步,感谢任何帮助。
答案 0 :(得分:0)
好的,让我们一步一步。你在说
ChannelInfo.updateAllChannels...
那么让我们看看如何声明updateAllChannels
方法:
static func updateAllChannels(
completionHandler:@escaping (_ channels: [ChannelInfo]) -> Void){
所以这是一个返回 no result 的静态函数。
但你实际所说的是:
channelArray = ChannelInfo.updateAllChannels...
但我们刚刚确定updateAllChannels
返回无结果。因此,您无需分配给channelArray
。这里的整个分配概念毫无意义。而且编译器告诉你了。您不能拥有此作业channelArray =
。删除那部分。
我想(但不要引用我)你的大问题是你忽略了返回给完成处理程序的值。你有这个:
ChannelInfo.updateAllChannels(completionHandler: { _ in
self.channelCollectionView.reloadData()
})
请参阅第一行末尾的_ in
?我认为这是你的整个问题。 updateAllChannels
正在将channels
作为参数交还给您,而您将它们扔掉。相反,我认为你想要这样的东西:
ChannelInfo.updateAllChannels(completionHandler: { channels in
channelArray = channels
self.channelCollectionView.reloadData()
})