2017-02-01 6 views
0

addObserver(_:selector:name:object:)post(name:object:userInfo:)の両方のメソッドには、「オブジェクト」パラメータが含まれています。対応する文書は、オブザーバが受信したい通知、すなわちこの送信者によって送信された通知のみがオブザーバに配信されるオブジェクト、および[ "これらの記述は、オブジェクト "パラメータ"がnilに設定されていなければ、post()メソッドが呼び出されたものと同じオブジェクトでなければならないという印象を与えてくれます。iOS通知 - オブジェクトパラメータを任意のオブジェクトにすることはできますか?

しかし、実際には、post()メソッドは任意のオブジェクトをそのオブジェクトパラメータとして含めることができるように見えます。同時に、任意のオブジェクトでaddObserver()メソッドを設定することができます。したがって、post()addObserver()のメソッドが同じ任意のオブジェクト(同じNotification.Name)を参照する場合、それらは送受信するように機能するはずです。実験では、これは正常に動作するようです。

次の例では、Observerは送信者からの特定の通知を任意に受信するように登録します。しかし、店は通知を掲示するものです。通知を送信する際、Storeには「送信者」であるオブジェクトと同じ瞬間が含まれます。オブザーバーは通知を受け取ります。これは、Storeが任意ではなく、通知の「送信者」であっても機能します。

class ArbitraryData { 
    var data: [String] = ["some handy info"] 
    func getMoreInfo() { 
     Store.aSyncReadData(self) 
    } 
} 

class Observer { 
    let arbitrary = ArbitraryData() 
    func initiate() { 

    NotificationCenter.default.addObserver(self, selector: #selector(handleNotice), 
     name: NSNotification.Name(rawValue: "eventHappenedNotice"), 
     object: arbitrary) 

     ... do stuff ... 

     arbitrary.getMoreInfo() 
    } 

    func handleNotice(notice: Notification) { 
     for infoItem in arbitrary.data { 
      print(infoItem) 
     } 
    } 
} 

class Store {   
    static func aSyncReadData(dataObject: ArbitraryData) { 

     ServerAPI.getSomeDataFromPersistentStore(completionHandler: { newData in 
      dataObject.data.append(newData) 
      NotificationCenter.default.post(NSNotification.Name(rawValue: "eventHappenedNotice"), 
      object: dataObject) 
     }) 
    } 
} 

目的の機能の任意のオブジェクト部分をこのように使用されており、それは安全なのですか?または、後でデバッグするのが難しいかもしれない何らかの障害につながる可能性のある任意のオブジェクトを使用していますか?

+0

@MuseerAnsari - 編集をありがとうございます。私はスタイルガイドをより緊密に進めるように努力します。 –

答えて

0

あなたがしていることを少し誤解していると思います。

まず、あなたの例では、Storeは通知を投稿する人ではありません。通知を投稿するのはArbitraryDataです。

はもう少し説明するために:あなたは/登録通知を投稿 objectパラメータを使用している場合は、通知が受信されます

/登録に使用されるオブジェクトは、オブジェクトが掲示に等しい場合にのみ送信されますお知らせ。したがって、通知の登録/送信にnameobjectの両方のパラメータを使用する場合は、適切な通知通信を行うには、nameobjectが等しくなければなりません。

objectパラメータを使用しない場合、唯一のチェックが名前に適用されます。

たとえば、ArbitraryDataの2つの異なるインスタンス(登録と送信の2つ)を使用すると、通知は機能しません。

+0

ありがとうございます。あなたが私の意図を理解する助けになったと思います。確かめるには:noticeを掲示しているオブジェクトであるarbitraryDataを決める、 "オブジェクト"パラメータとして 'のpost()'にarbitraryDataオブジェクトを渡すことによって、それは正しいのでしょうか?結果として、nilが 'post()' mehtodに渡された場合、その通知を掲示するオブジェクトは存在しないと言うのは正しいでしょうか? –

+0

私の意見では、両方の声明は安全で真実です。 – danypata

関連する問題