2016-09-01 8 views
0

私は以下のようなfirebaseとやりとりするためにシングルトンをかなり広く使用してきました。私はシングルトンを非常に便利だと思うので、私はそれを使い始める前に、より多くの洞察を得たいと思っていました。オンラインコースのインストラクターの一人は、シングルトンの使用について非常に注意する必要があると述べましたが、なぜ彼はなぜその理由を説明しませんでした。どのように正しく使うことができるのか、それを使用するのに非常に注意する必要があるのはなぜですか?IOSでのシングルトンの使用と気を付けるもの

class DataService { 
static let dataService = DataService() 

private var _BASE_REF = Firebase(url: "\(BASE_URL)") 
private var _USER_REF = Firebase(url: "\(BASE_URL)/users") 
private var _JOKE_REF = Firebase(url: "\(BASE_URL)/jokes") 

var BASE_REF: Firebase { 
    return _BASE_REF 
} 

var USER_REF: Firebase { 
    return _USER_REF 
} 

var CURRENT_USER_REF: Firebase { 
    let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String 

    let currentUser = Firebase(url: "\(BASE_REF)").childByAppendingPath("users").childByAppendingPath(userID) 

    return currentUser! 
} 

var JOKE_REF: Firebase { 
    return _JOKE_REF 
} 

はまた、私はまた、(私は少し良く最初にそれを理解したいと、私はまだ作成していない)は、以下に示すように、別のシングルトンを作成するつもりです。これらの「投稿」は複数のVCによってアクセスされるため、すべてのVCが競合を起こさずに必要な配列にアクセスできるように、シングルトンを使用したかったのです。一般的に言えば、私はこの種の設定で気を付ける必要があるものは何ですか?

ご迷惑をおかけして申し訳ございません。しかし、アイデアは私の知る限りでは、シングルトンに関する唯一の主な問題はある

class PostService { 

static let ps = PostService() 

private var _myPosts = [Post]() 
private var _otherPeoplesPosts = [Post]() 
private var _followingPosts = [Post]() 

var myPosts: [Post] { 
    return _myPosts 

} 

var otherPeoplesPosts: [Post] { 
    return _otherPeoplesPosts 
} 

var followingPosts: [Post] { 
    return _followingPosts 
} 
+0

シングルトンのポイントが単純にデータを永続させるのであれば、コアデータのような代替手段を使用することができます。より良いシングルトンを使用する代わりに、データをView Controllerに渡すことができます。 メモリ管理に関しては安全です。プロパティをリセットしてオブジェクトがシングルトンへの参照を保持しない場合、メモリリークは起こりません。 私は、すべてのクラスがそれを使用して利益を得ることができる画像キャッシング(UIView、UIViewController、任意のモデルクラス/構造体など)のようなサービスを連続して実行するタスクやサービスを持っていたときにはシングルトンのみを使用しました –

+0

私はイメージ・キャッシュのインスタンスを作成し、必要な場所に渡すことができるので、キャッシュは最良の例でもありません。 –

+0

"シングルトンはアプリの生涯にわたって周りを運んでいる"。これは、フォアグラウンドとバックグラウンドが閉じられる前に、アプリのライフタイムやアプリのライフタイムを意味しますか? – user172902

答えて

0

これらの具体例(メモリ、割り当て、タイミング??)でシングルトンを使用して注意するかの概要を取得することですあなたがそれらを使っているかどうかに関係なく、彼らは記憶に残っているという事実。

最初のシングルトンは、静的関数を持つ構造体で簡単に置き換えることができるようです。

コメントの1つで説明したように、オブジェクトがヒープにない(少なくともそれらのすべてではない)ので、何らかの種類のストレージ(つまりCoreData)を使用する方が良いでしょう。 あなたの配列が数十のオブジェクトで構成されている場合、問題はありませんが、すべての配列が何百ものオブジェクトを保持していると想像してください。 確かに、アプリのどこからでもアクセスできますが、メモリ使用量が非常に高くなるという欠点があります。

CoreDataを使用していない場合は、プロジェクトに統合するのが問題になります。ドキュメントフォルダにデータを格納し、メモリ内のオブジェクトの数を制限し、配列にないオブジェクトをドキュメントフォルダからロードし、最後に使用されたオブジェクト(CoreDataのようなもの)を置き換えます。理想的ではなく、いくつかの強烈なロジックが必要ですが、ヒープ内にオブジェクトが多すぎてメモリ警告が発生するよりも優れています。

ボトムラインは、データの用途とサイズによって決まります。

これは何らかの形で役立ちます。

関連する問題