Я написал код на Swift 2 и преобразовал его в Swift 3. К сожалению, он больше не работает.
Вот инкриминируемый код:
func loadImage( url: String?, completionHandler: @escaping( UIImage?, NSError? ) -> Void ) {
var theSrc: String?
if let src = url {
theSrc = src
} else {
theSrc = placeHolderImg
}
let url = URL( string: theSrc! )!
let request = NSMutableURLRequest( url: url )
URLSession.shared.dataTask( with: request as URLRequest ) { data, response, error in
if error == nil {
let image = UIImage( data:data! )
completionHandler( image, nil )
} else {
completionHandler( nil, error as NSError? )
}
}.resume()
}
Эта функция вызывается так:
WordPressWebServices.sharedInstance.loadImage( url: theImgUrl, completionHandler: { ( image, error ) -> Void in
DispatchQueue.main.async( execute: {
//Some code
} )
} )
Вот что я получаю из консоли отладки:
2016-10-19 06:40:15.458 tdr-ios-prototype[652:8825] -[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x6000000586f0
2016-10-19 06:40:15.478 tdr-ios-prototype[652:8825] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue unsignedIntegerValue]: unrecognized selector sent to instance 0x6000000586f0'
*** First throw call stack:
(
0 CoreFoundation 0x000000010dac634b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010d52721e objc_exception_throw + 48
2 CoreFoundation 0x000000010db35f34 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 CoreFoundation 0x000000010da4bc15 ___forwarding___ + 1013
4 CoreFoundation 0x000000010da4b798 _CF_forwarding_prep_0 + 120
5 UIFoundation 0x0000000114e81953 -[NSHTMLReader _loadUsingWebKit] + 1329
6 UIFoundation 0x0000000114e82f15 -[NSHTMLReader attributedString] + 22
7 UIFoundation 0x0000000114e1945c _NSReadAttributedStringFromURLOrData + 5779
8 UIFoundation 0x0000000114e17d35 -[NSAttributedString(NSAttributedStringUIFoundationAdditions) initWithData:options:documentAttributes:error:] + 115
9 tdr-ios-prototype 0x000000010ceae80d _TTOFE5UIKitCSo18NSAttributedStringcfzT4dataV10Foundation4Data7optionsGVs10DictionarySSP__18documentAttributesGSqGVs33AutoreleasingUnsafeMutablePointerGSqCSo12NSDictionary____S0_ + 173
10 tdr-ios-prototype 0x000000010ceae6c4 _TFE5UIKitCSo18NSAttributedStringCfzT4dataV10Foundation4Data7optionsGVs10DictionarySSP__18documentAttributesGSqGVs33AutoreleasingUnsafeMutablePointerGSqCSo12NSDictionary____S0_ + 100
11 tdr-ios-prototype 0x000000010ceae14f _TFE17tdr_ios_prototypeSSCfT17htmlEncodedStringSS_GSqSS_ + 751
12 tdr-ios-prototype 0x000000010cea4191 _TFFFFC17tdr_ios_prototype11PostManager14getTheLastPostFT_T_U_FTGSqGSaGVs10DictionarySSPs9AnyObject____GSqCSo7NSError__T_U_FTGSqCSo7UIImage_GSqS3___T_U_FT_T_ + 545
13 tdr-ios-prototype 0x000000010cea55c0 _TPA__TFFFFC17tdr_ios_prototype11PostManager14getTheLastPostFT_T_U_FTGSqGSaGVs10DictionarySSPs9AnyObject____GSqCSo7NSError__T_U_FTGSqCSo7UIImage_GSqS3___T_U_FT_T_ + 512
14 tdr-ios-prototype 0x000000010ce7b827 _TTRXFo___XFdCb___ + 39
15 libdispatch.dylib 0x00000001119e9980 _dispatch_call_block_and_release + 12
16 libdispatch.dylib 0x0000000111a130cd _dispatch_client_callout + 8
17 libdispatch.dylib 0x00000001119f38d6 _dispatch_main_queue_callback_4CF + 406
18 CoreFoundation 0x000000010da8a4f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
19 CoreFoundation 0x000000010da4ff8d __CFRunLoopRun + 2205
20 CoreFoundation 0x000000010da4f494 CFRunLoopRunSpecific + 420
21 GraphicsServices 0x0000000113903a6f GSEventRunModal + 161
22 UIKit 0x000000010e8e8f34 UIApplicationMain + 159
23 tdr-ios-prototype 0x000000010cea64ff main + 111
24 libdyld.dylib 0x0000000111a5f68d start + 1
25 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Я искал в Интернете и нашел несколько сообщений об ошибках такого рода, но не смог найти решение. Это проблема приведения типов или я неправильно использую обработчики завершения?
Из того, что я нашел, следующая строка кажется проблемой. Или, по крайней мере, это точка, в которой происходит сбой приложения.
completionHandler( image, nil )
Метод loadImage
является частью процесса под названием LoadTheLastPost
. Я работаю с Wordpress REST API V2. В основном объект с именем PostManager
создается в AppDelegate
(didFinishLaunchingWithOptions). Этот объект вызовет метод getTheLastPost
, включенный в класс с именем WordPressWebServices
, который является одноэлементным. Метод loadImage
вызывается через getTheLasPost
. Может, в этом что-то не так? Что вы думаете?
Может быть, я могу добавить, что после того, как я собрал данные, я создаю объект Post следующим образом:
let theLastPost = Post( id: postID!, title: String( htmlEncodedString: title! ), content: String( htmlEncodedString: content! ), imageId: imgID!, imageUrl: theImgUrl, image: theImg )
Вот краткий обзор моего класса Post:
class Post: NSObject, NSCoding {
var id: Int
var title: String?
var content: String?
var imageId: Int
var imageUrl: String?
var image: UIImage?
init?( id: Int, title: String?, content: String?, imageId: Int, imageUrl: String?, image: UIImage? ) {
self.id = id
self.title = title
self.content = content
self.imageId = imageId
self.imageUrl = imageUrl
self.image = image
super.init()
if id < 1 {
return nil
}
}
}
Любая помощь приветствуется! Большое спасибо!
ИЗМЕНИТЬ
Кажется, я ошибся в происхождении моей проблемы. Проблема исходит из этой строки:
let theLastPost = Post( id: postID!, title: String( htmlEncodedString: title! ), content: String( htmlEncodedString: content! ), imageId: imgID!, imageUrl: theImgUrl, image: theImg )
String( htmlEncodedString: title! )
и String( htmlEncodedString: content! )
вызывают ошибку.
Вот мое расширение String:
extension String {
init?( htmlEncodedString: String ) {
let encodedData = htmlEncodedString.data( using: String.Encoding.utf8 )!
let attributedOptions: [ String: AnyObject ] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject ]
var attributedString: NSAttributedString?
do {
attributedString = try NSAttributedString( data: encodedData, options: attributedOptions, documentAttributes: nil )
} catch {
print( error )
}
self.init( attributedString!.string )
}
}
РЕШЕНИЕ
Проблема возникла из-за моего расширения String. Благодаря этому сообщению https://stackoverflow.com/a/39644620/1826332, которое я видел с самого начала, но подумал это было что-то другое, мне удалось найти решение.
пришлось отредактировать строку
let attributedOptions: [ String: AnyObject ] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8 as AnyObject ]
...как это :
let attributedOptions: [ String: AnyObject ] = [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, NSCharacterEncodingDocumentAttribute: NSNumber(value: String.Encoding.utf8.rawValue) as AnyObject ]