2017-07-28 4 views
2

イベントについての詳細をロードする方法(タイトル、説明、サムネイルのパスなどをsqliteデータベースに照会する方法)は、これを大量に呼び出す必要があるため私はGrand Central Dispatchを使ってバックグラウンドスレッドにディスパッチしています。iOSスレッドでUIScreenにアクセスする

問題は、UIKitスレッドの例外が発生していることです(メインスレッド以外のスレッドでUIメソッドを実行しているため、アプリケーションがクラッシュすることがあります)。 (

bool retina = (UIScreen.MainScreen.Scale > 1.0); 

私は、デバイスは、網膜の画面を持っているかどうかを判断するためにUIScreenを使用しています:私はこれを見つけるのはほとんど不可能だったまったくUIを変更していないんだけど、私は最終的に1行のコードにそれを絞り込みますサムネイル画像のパスに最後に "@ 2x"を付加する必要があるかどうかを判断し、これにアクセスする(静的変数のように見える)と、そのUIKit例外がスローされます。

画面がUIKitを使用しない(またはバックグラウンドスレッドセーフである)網膜であるかどうかを判断するための回避策がありますか?それを把握するには良い方法がありますか?

注:私はXamarin(C#)を使ってアプリケーションを作成していますが、迅速な回答は完全にうまく変換できます。

+1

起動時(つまりメインスレッド)に変数を1回だけ設定してその後で使用することはできませんか? –

+0

私はそれについて考えましたが、このメソッドは多くの異なる場所で呼び出され、多くのリファクタリングを必要とします。起動時にそれを決定したシングルトンをセットアップしない限り、スクリーンが網膜であるかどうかを判断するには余計になるでしょうか?それとも良いアイデアですか? –

+0

Re:「別の場所」データの読み込みを管理するために特定のオブジェクトタイプがありますか?メインスレッドで初期化されていますか? (そうでなければ、私はXamarinアーキテクチャを知らないが、 "Xcode"アプリケーションでは、アプリケーション代理人のプロパティにすることを夢見ているだろう - 単一の変数には完璧ではないが妥当ではない。) –

答えて

2

まず、画面に表示する画像を開くときは、@2を指定する必要はありません。 iOSはUIImage(named: "BaseName")の正しいバージョンを選択します。

しかし、あなたがする必要がある場合は、ここではあなたのスウィフトコードです:

func isRetina() -> Bool 
{ 
    var scale: CGFloat = 0.0 
    DispatchQueue.main.sync 
    { 
     scale = UIScreen.main.scale 
    } 

    return scale > 1.0 
} 

あなたは多くの場所でそれを使用するため、いくつかのユーティリティ/ベース・クラスでこれを置くことを検討してください。

+0

完全に忘れてしまったGrand Central Dispatchで通話をブロックしています。完璧な答え –

+1

喜んで助けてください。答えを自由に感じてください:-)(あるいは100点以上ではできませんか?) –

関連する問題