所以我对swift相对较新,最近我开始了一个新项目,需要对远程服务器上的JSON api进行多次网络请求,因此我决定使用Alamofire库(通过cocoapods包含的1.1版本)教程:
http://www.raywenderlich.com/85080/beginning-alamofire-tutorial http://www.raywenderlich.com/87595/intermediate-alamofire-tutorial
以防万一它是相关的,这是我在podfile中用来包含Alamofire库的代码:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Alamofire', '~> 1.1'
一个要求是需要为特定的tableview下载和缓存图像。在教程之后,我构建了框架提供的Alamofire.Request类的扩展:
extension Alamofire.Request {
class func imageResponseSerializer() -> Serializer {
return { request, response, data in
if data == nil {
return (nil, nil)
}
let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale)
return (image, nil)
}
}
func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self {
return response(serializer: Request.imageResponseSerializer(), completionHandler: { (request, response, image, error) in
completionHandler(request, response, image as? UIImage, error)
})
}
}
这是我用
请求的图像Alamofire.Request(.GET, "IMAGE URL").responseImage(){
(request, _, image, error) in
// Logic used to display image and save it to the cache
}
测试没有缓存的下载显示它可以工作,我可以显示它们,但是当我需要原始URL作为我的NSCache的密钥时出现问题,但每次我尝试访问该属性(request.URLString) ,xcode总是会抛出很多错误。
尝试访问此属性:
self.imageCache.setObject(image!, forKey: request.URLString)
抛出"模糊地使用URLString"在编辑器中,并尝试将其与其他字符串值进行比较,总是会抛出一个错误,说“"无法调用'操作数'使用类型'($ T6 ??,String)''"
的参数列表**请注意$ T6中的数字?取决于我使用它的位置
我尝试搜索此类错误的引用,但我发现的所有内容都与选项的工作原理有关(不知道这是否存在问题,但这些问题都没有奏效),所以如果任何人都知道这个错误的解决方案,我真的很感激。
修改
这是我使用它的完整功能(在出现错误的行中注释)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Current Cell
let cell = self.table.dequeueReusableCellWithIdentifier("entry_cell", forIndexPath: indexPath) as EntryTableViewCell
// Current entry
let entry = entries[indexPath.row]
// Date Formatter
var formatter = NSDateFormatter()
formatter.dateStyle = NSDateFormatterStyle.LongStyle
cell.entryTitle.text = entry.title!
cell.entryContent.text = entry.content!
cell.entryDateLabel.text = formatter.stringFromDate(entry.createdAt!)
// Try to download image
let imageURL = ApplicationPreferences.resourcesURLPrefix + entry.picture!
// 1
if cell.request?.request.URLString != imageURL { // Error: cannot invoke '!=' with an argument list of type '($T6??, String)'
cell.request?.cancel()
}
// 2
if let image = self.imageCache.objectForKey(imageURL) as? UIImage {
cell.entryImageView.image = image
} else {
// 3
cell.entryImageView.image = nil
// 4
cell.request = Alamofire.request(.GET, imageURL).validate(contentType: ["image/*"]).responseImage() {
(request, _, image, error) in
if error == nil && image != nil {
// 5
self.imageCache.setObject(image!, forKey: request.URLString) // Error: Ambiguous use of 'URLString'
// 6
if request.URLString == cell.request?.request.URLString { // Error: Cannot invoke '==' with an argumet list of type '($T2??, $T8??)'
cell.entryImageView.image = image
}
} else {
/*
If the cell went off-screen before the image was downloaded, we cancel it and
an NSURLErrorDomain (-999: cancelled) is returned. This is a normal behavior.
*/
}
}
}
return cell
}
以防万一,该UITableViewCell子类的来源是:
import UIKit
import Alamofire
class EntryTableViewCell: UITableViewCell {
@IBOutlet weak var entryImageView: UIImageView!
@IBOutlet weak var entryTitle: UILabel!
@IBOutlet weak var entryContent: UILabel!
@IBOutlet weak var entryDateBackgroundView: UIView!
@IBOutlet weak var entryDateLabel: UILabel!
var request: Alamofire.Request?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
答案 0 :(得分:0)
我猜你正在使用Xcode 6.3b3 ......这是正确的吗?如果是的话......请继续阅读。如果没有,请评论这个答案,我会修改。
您有两个位置(数字1和6),您将URLString
与URLString?
进行比较,这就是您收到编译器错误的原因。您需要在其上方进行可选绑定或手动展开,这在任何一种情况下都不是一个好主意。
仍然不能完全确定5号是否有实际问题,或者是否是1号和6号的副作用。
在Swift的最新版本中,他们在识别出具有默认参数值时应该调用哪些函数时,整理了一些模糊性。 Alamofire有一些无效的函数调用需要重构才能使用最新的Swift 1.2编译器。您最有可能要做的是在Alamofire中注释掉以下几行。
public func response(completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self {
return response(Request.responseDataSerializer(), completionHandler: completionHandler)
}
这是一个(有一些)罪犯最有可能绊倒你的图像序列化器。我明天最有可能推高公关。我只是想在此期间我指出你正确的方向。