0

フォーラムを調べてみると、この問題はときどき頭角を現すものであることがわかりました。そして明らかに、さまざまなケースの広い範囲でそうしています。私が見つけることができたものはどれも、私のものと似ているようには見えません。

使用可能な Twitter アプリケーションを作成するプログラム (レッスン) の途中です。現在テストすると、プログラムは正常に実行され、エラーは発生しません。しかし、アカウントを選択すると、プログラムがクラッシュし、選択したユーザーのアバターをロードすることになっているイメージ メソッドにエラー メッセージが表示されます。有効な画像を取得したり、データをフェッチしたりすることはまったくできないと思いますが(デバッグ領域の ImageData = (NSDATA?) nil 行のため)、方法や方法は言うまでもなく、何も確信が持てません解決策を見つける場所。間違ったキーワードで検索している場合は、お知らせください。(exc_bad_instruction と uiimage エラーを探しています) よろしくお願いします。

問題が発生しているコードのスニペットを以下に掲載し、その下にデバッグ領域に表示される内容を掲載します。

    if let cachedImage = image {
        cell.tweetUserAvatar.image = cachedImage
    }
    else {
        cell.tweetUserAvatar.image = UIImage(named: "camera.png")

        queue?.addOperationWithBlock() {
            let imageURL = NSURL(string: imageURLString) as NSURL!
            let imageData = NSData(contentsOfURL: imageURL) as NSData?
            let image = UIImage(data: imageData!) as UIImage? // EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subode=0x0)

            if let downloadedImage = image {
                NSOperationQueue.mainQueue().addOperationWithBlock(){
                    let cell = tableView.cellForRowAtIndexPath(indexPath) as! TweetCell

                        cell.tweetUserAvatar.image = downloadedImage
                }

                self.imageCache?.setObject(downloadedImage, forKey: imageURLString)
            }
        }
    }

デバッグ領域:

    imageURLString  String           
    "http://pbs.twimg.com/profile_images/465756113825067008/8jH2nZO0_normal.png"    
    tableView   UITableView 0x00007fc52481b400
    indexPath   NSIndexPath *   0xc000000000000016
    self Chapter7_8___Social_App.FeedViewController 0x00007fc5235f5ef0
    imageURL    NSURL! "http://pbs.twimg.com/profile_images/465756113825067008/8jH2nZO0_normal.png" 
    imageData   NSData? nil None
    image   UIImage?    0x000000010ee778dd
    downloadedImage UIImage     
4

1 に答える 1

0

私もこの問題を抱えており、イメージが不良データで初期化されていることがわかりました。これは、サーバーに要求した画像が存在せず、サーバーが UIImage に変換できない応答を返したことを意味します。

これを軽減するには、次のことを実行できます。

if let cachedImage = image {
    cell.tweetUserAvatar.image = cachedImage
}
else {
    cell.tweetUserAvatar.image = UIImage(named: "camera.png")

    queue?.addOperationWithBlock() {
        let imageURL = NSURL(string: imageURLString) as NSURL!
        let imageData = NSData(contentsOfURL: imageURL) as NSData?

        if let image = UIImage(data: imageData!) {
            let downloadedImage = image
            NSOperationQueue.mainQueue().addOperationWithBlock(){
                let cell = tableView.cellForRowAtIndexPath(indexPath) as! TweetCell

                    cell.tweetUserAvatar.image = downloadedImage
            }

            self.imageCache?.setObject(downloadedImage, forKey: imageURLString)
        }
    }
}

私が上で行ったことは変更されました

        let image = UIImage(data: imageData!) as UIImage?

        if let downloadedImage = image {
           ...
           ...
        }

に:

        if let image = UIImage(data: imageData!) {
           let downloadedImage = image
           ...
           ...
        }    

このようにして、イメージが正常に作成されたことを確認しました。イメージを作成できない場合、コードは実行されず、エラーは発生しません。

「imageURLString」で指定した URL に画像があると思われる場合は、使用している URL を確認することをお勧めします。

また、UIIMage を作成できなかったのは、データが返されなかったことにも気付きました。これが当てはまるかどうかは、次のようにテストして確認できます。

let imageData = NSData(contentsOfURL: imageURL) as NSData?
if imageData != nil {
  Do More Stuff
  ...
{

私の答えがお役に立てば幸いです。ご不明な点がございましたら、お気軽にコメントを残してください。できる限りお答えいたします。

詳細情報:
この質問と回答では、提供されたデータから UIImage を作成できない場合の処理​​方法についても説明します。

于 2016-03-12T02:32:33.457 に答える