2016-05-05 4 views
0

https://github.com/mateo951/ISBN-Vista-Jera-rquica- Github Link インターネット検索後に値が追加されているはずです。インターネット検索は関数内で呼び出され、2つの文字列とイメージを返します。返された値を構造体に追加しようとすると、イメージは保存されますが、文字列はゼロになります。指定された値を返しても構造体に値が追加されない

var datosLibros = [bookData]() 

@IBAction func Search(sender: UITextField) { 
    let (title1, author1, cover1) = (internetSearch(sender.text!)) 
    let libro = bookData(title: title1, author: author1,image:cover1) 
    datosLibros.append(libro) 
    print(datosLibros) 
} 

保存されたコンソールに出力されている構造以下の通りです:

bookData(title: "", author: "", image: <UIImage: 0x7f851a57fbf0>, {0, 0}) 

構造:提供されるヘルプのいずれかのアドバイスのための先進的で

struct bookData { 
    var title: String 
    var author: String 
    var image: UIImage 
    init(title: String, author: String, image: UIImage) { 
     self.title = title 
     self.author = author 
     self.image = image 
} 

}

感謝。私は迅速なので、発見されたものの多くが新しいです。

+0

あなたの 'internetSearch'機能では、実際にhttpリクエストを実行していますか? –

+0

いいえ私はそうは思いません..私はNSURLセッションを使用し、次にURLを使ってデータタスクを使用しました..でも私はすでにチェックしていて、値は実際には検索後の関数によって返されます。 –

答えて

0

問題は投稿したコードではなく、internetSearchです。

しかし、私はそこで何が起こっているのか説明する前に、スウィフトの構造について簡単にメモします。構造体には、構造体に定義された格納された各プロパティーの1つの値をパラメーターとして持つ1つのフリー初期化子が付属しています。引数ラベルは変数ラベルに対応します。

それが自動的に限り、あなたは任意の追加を作成しないよう、あなたのために提供されますので、だから、(種類は大文字にする必要がありますので、本当にBookDataでなければなりません)あなたの構造体bookDataのために、あなたが書いた初期化子を含める必要はありませんBookData初期化子。

あなたの結果は期待通りではありません。 Stringさんはnilに戻っていません。代わりに、空の "String"または ""として戻ってきます。 Swiftでは、 ""はnilとはまったく異なります。これは値が完全に存在しないことを意味します。だからあなたのStringは本当にそこにあります、彼らはただ空です。

いいえ、私たちのStringが空に戻ってきています。私たちのイメージはいかがですか?いいえ、私たちのイメージは戻っていません。あなたはUIImageの参照がコンソールに表示されているのを見たことがあったと思っていましたが、もっと見ると偽の画像になります。インスタンスのメモリーアドレスの後ろに "{0、0}"があることを確認してください。私が知っている限り、これはイメージのサイズが0 x 0であることを意味します。サイズ0 x 0を持つ有用なイメージの数はいくつですか?

これで、私たちのStringが空に戻ってきて、効果的に私たちのイメージになっていることがわかりました。ここで何が起こっているのですか?

まあ、私はGitHubの上で見つかったinternetSearchの実装では、これは最初の事あなたが実行します。当然のことながら

var bookTitle = String() 
var bookAuthor = String() 
var bookCover = UIImage() 

あなたがウンチする準備ができて、正しいタイプのいくつかの変数を持っているように、あなたはこれを行いますあなたがそれらを見つけるならば、いくつかの実際の結果。ちょうど楽しみのために、結果がなければ上記のコードの結果がどうなるか見てみましょう。

まあ、initializer for String that accepts no parametersは、空のStringが作成されます。

さて、私たちのイメージはどうですか?UIImageのドキュメントでは、パラメータを取らないイニシャライザについては言及していませんが、NSObjectから継承し、空のイメージオブジェクトを作成することになります。

これで、internetSearchが返すものは実際には結果がない場合の結果と同じであることがわかりました。あなたが知っているものを探していると仮定すると、検索ロジックに問題があるでしょうか?必ずしも。

var bookTitle = String() 
var bookAuthor = String() 
var bookCover = UIImage() 

let session = NSURLSession.sharedSession() 

let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in 

// Lots of code that eventually sets the three variables above to a found result 

} 

task.resume() 

return (bookTitle, bookAuthor, bookCover) 

NSURLSessionは非同期でそのタスクを実行しているという事実を除いて、罰金とダンディ思わ:私はinternetSearchの残りの部分の実装は、あなたがそうのように使用NSURLSessionに依存していることに気づきました!はい、部分的には、メインのキューに戻っていくつかのタスクを実行することさえできますが、クロージャ全体が非同期です。これは、task.resume()と呼ばれるとすぐに、NSURLSessionがそのタスクを独自のスレッド/キュー/ネットワーク上で実行し、そのタスクが設定されるとすぐに完了前に戻ってくることを意味します。したがって、task.resume()は、タスク内の検索コードが実際に実行される前、特に完了する前にすぐに戻ります。

ランタイムは次に、次の行に移動し、指示したとおりに、これら3つの変数を返します。 taskが非同期に実行して有用な値に設定する前に、internetSearch関数が最初の空の変数を返すので、これはもちろん問題です。

完全に機能するソリューションを提案することはおそらくこの長い答えの範囲を超えていますが、実装の詳細を大幅に変更する必要があります。NSURLSessionによって返されたデータを検索する必要があります。

コードを投稿しないで、可能な解決策の1つは、internetSearch関数が何も返さないようにすることですが、タスクコールの完了時に、結果を配列に追加して表示する関数を表示します。この概念を研究してください。あなたはあなたよりも結果を見つけた場合、この方法で

var bookTitle: String? 
var bookAuthor: String? 
var bookCover: UIImage? 

var bookTitle = String() 
var bookAuthor = String() 
var bookCover = UIImage() 

...しかしとして:

はまた、私がいないと、あなたの初期値を宣言することにより、さらにinternetSearchの実装を変更することをお勧めしますOptionalにラップされていますが、そうでない場合は、nilとして表すことができます。これは自動的に直上のコードの変数のデフォルト値になります。

+0

ありがとうMatthew !!!私は本当に時間と患者があらゆる細部を説明し、さらにその可能性のあるエラーを理解しようと感謝しています。あなたは、ほぼ6ヶ月の "経験"の疑いを解消しました。私はあなたのアドバイスを考慮に入れ、うまくいけば、私はこのコードを機能させることができました。再度、感謝します! –

+0

ようこそ。お役に立てて嬉しいです! –

+0

良いニュースMatthew !!私は正常に動作するように関数を作ることに成功し、現在は適切な値を返します。私はセッションを削除し、do-catchブロックで試しました!もう一度ありがとう... –

関連する問題