2017-11-26 15 views
0

アトミックなNSOperationQueueを作成する必要があります。NSOperationQueue用セッターの作成

@property (atomic, strong) NSOperationQueue *queue; 

私はこのゲッター持っている:

- (NSOperationQueue *)queue { 
    if (_queue == nil) { 
    _queue = [NSOperationQueue mainQueue]; 
    [_queue setMaxConcurrentOperationCount:1]; 
    } 
    return _queue; 
} 

をしかし、Xcodeは、私はセッターを作成する必要が言います。

私のこのケースのためのセッターはどうでしょうか?何も思いつきません。

+0

私はあなたのゲッターでその 'maxConcurrentCount'を削除したいと思います。メインキューはすでにシリアルキューであり、 'setMaxConcurrentCount'を呼び出すと、メインキューに関する誤解が示唆されます。独自のキューを作成する場合は、必ず 'maxConcurrentCount'を設定しますが、メインキューを使用する場合は設定しないでください。 – Rob

答えて

2

2つの観測:

  1. 独自のセッターを定義した場合、それは次のようになります。あなたは、両方のアクセサメソッド(セッターとゲッターの両方)を実装する場合は、覚えておいてください

    - (void)setQueue:(NSOperationQueue *)queue { 
        _queue = queue; 
    } 
    

    、あなたは手作業でivarを合成しなければならないでしょう。あなたの@implementation

    @synthesize queue = _queue; 
    

    、コンパイラはもはや安全にあなたがすべてで、特定の名前のIVARを必要と想定することはできませんので。

  2. atomicまたはnonatomicのいずれかに再訪する必要があります。あなたのゲッターはatomicではありません(私の例のセッターでもありません)ので、おそらくこれを作るにはnonatomicです。 「atomic」は、合成されたアクセサによって、ゲッターメソッドによって値が常に完全に取得されること、またはアクセサが異なるスレッドから同時に呼び出された場合でもセッターメソッドによって完全に設定されることを保証することを意味します(Programming with Objective-C: Properties are atomic by default)。多くの場合、アトミックアクセサメソッドは必要ありませんが、そうした場合は、これらの実装を変更して(例えば、NSLock@synchronizedディレクティブ、シリアルキュー、リーダライタパターンなど)対応させます。

    nonatomicにしておけば、カスタムゲッタに付属するカスタムセッタを作成する必要がなくなります。 atomicプロパティに対して独自のゲッターを実装した場合、コンパイラーは対応するatomicセッターを合成できません。これは、可能な異なる同期メカニズムが多数あるため、そのセッターをゲッターと同期させる方法を知らないためです。しかし、同期を必要としないプロパティnonatomicを作成すると、コンパイラはシンプルな同期化されていないセッタを合成し、セッタを実装するよう指示する警告も消え去ります。

1

まず、プロパティ "queue"を読み書きプロパティとして宣言しました。それは意味をなさない。あなたは本当に誰もが "待ち行列"に割り当てることを望んでいません。

第2に、プロパティを「アトミック」と宣言しました。あなたが「原子」が何をするかを読むか、それが有用であることは非常にまれであると私は信じています。手書きのゲッターまたはセッターは、常に非アトミックです。したがって、非アトミックなゲッターがあります。プロパティ自体はアトミックな読み書きプロパティなので、自動的に生成されたアトミックなセッターがあります。非原子ゲッターと原子セッターを組み合わせることはできません。

解決方法:プロパティをnonatomicおよび読み取り専用に変更します。 1つの副作用は_queueバッキング変数を失うことです(すべての必要なアクセサーが実装されている場合はバッキング変数を取得しません)。したがって、_queueを自分で宣言する必要があります。

+0

"手書きのゲッターまたはセッターは常に非アトミックです"、うーん...私はすべてのアトミックコードが自動的に書かれているかどうかは分かりませんでした;-) – CRD

関連する問題