অবজেক্টিভ-সি তে এনএসনিটিফিকেশন সেন্টারের মাধ্যমে বার্তা প্রেরণ এবং গ্রহণ করবেন?


610

আমি NSNotificationCenterউদ্দেশ্য-সি এর মাধ্যমে বার্তা প্রেরণ ও গ্রহণের চেষ্টা করছি । তবে এটি কীভাবে করা যায় তার কোনও উদাহরণ আমি খুঁজে পাচ্ছি না। আপনি কীভাবে বার্তা প্রেরণ এবং গ্রহণ করবেন NSNotificationCenter?


সত্যিই খুব দরকারী, ধন্যবাদ। একটি জিনিস, অ্যাডঅবার্সার পদ্ধতিতে নির্দিষ্ট নির্বাচকের পরে চলমান আধা কোলন থাকা উচিত নয় (কমপক্ষে এটির আমার সংস্করণে ব্যতিক্রম ঘটেছে)। আমি উপরের কোডটি সম্পাদনা করার চেষ্টা করেছি তবে মূল কোডটিতে সমস্যা ফর্ম্যাট করার কারণে পরিবর্তনটি গ্রহণ করা হয়নি।
ব্রুনিয়াস

3
এটি দুর্দান্ত ছিল: cocoawithlove.com/2008/06/…
আরম

2
এই কিটি উপায়টি খুব বেসিক এবং বিস্তৃত, একটি সামান্য গুগলিং ভাল হবে
দাইজ-দজন

এটি এখানে সম্পর্কিত প্রশ্নের সাথে খুব মিল: স্ট্যাকওভারফ্লো.com
ডেভিড ডগলাস

55
আমি এটিকে অযৌক্তিক বলে মনে করি যে স্ট্যাক ওভারফ্লোর ব্যবহারকারীরা এতটা স্পষ্টভাবে এর কার্যকারিতা সম্পর্কে মন্তব্য করেছেন যখন এটিকে একটি গঠনমূলক নয় বলে বন্ধ করা হয়
চেট

উত্তর:


1019
@implementation TestClass

- (void) dealloc
{
    // If you don't remove yourself as an observer, the Notification Center
    // will continue to try and send notification objects to the deallocated
    // object.
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

- (id) init
{
    self = [super init];
    if (!self) return nil;

    // Add this instance of TestClass as an observer of the TestNotification.
    // We tell the notification center to inform us of "TestNotification"
    // notifications using the receiveTestNotification: selector. By
    // specifying object:nil, we tell the notification center that we are not
    // interested in who posted the notification. If you provided an actual
    // object rather than nil, the notification center will only notify you
    // when the notification was posted by that particular object.

    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveTestNotification:) 
        name:@"TestNotification"
        object:nil];

    return self;
}

- (void) receiveTestNotification:(NSNotification *) notification
{
    // [notification name] should always be @"TestNotification"
    // unless you use this method for observation of other notifications
    // as well.

    if ([[notification name] isEqualToString:@"TestNotification"])
        NSLog (@"Successfully received the test notification!");
}

@end

... অন্য কোথাও অন্য কোথাও ...

- (void) someMethod
{

    // All instances of TestClass will be notified
    [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"TestNotification" 
        object:self];

}

2
[এনএসনিটিফিকেশন সেন্টার ডিফল্ট সেন্টার] কোথায় রাখা হয়েছে তা অবাক করেই ভাবছি। এটি আপনার অ্যাপডেলিগেটে রাখাই ভাল?
ফুলভিও

14
@ ফুলভিও: এটি নির্ভর করে, যদি আপনি আপনার অ্যাপ্লিকেশনটির সমস্ত অংশকে সম্ভাব্যভাবে প্রভাবিত করে এমন বিজ্ঞপ্তিগুলি গ্রহণ বা পোস্ট করে থাকেন তবে এটি আপনার অ্যাপডিজিলেটে রাখুন। যদি আপনি কেবলমাত্র একটি একক শ্রেণিকে প্রভাবিত করে এমন বিজ্ঞপ্তিগুলি গ্রহণ / পোস্ট করছেন তবে পরিবর্তে class শ্রেণিতে রাখুন।
ড্রিমলাক্স

1
@ ড্রিমলাক্স ট্রুথ, তবে এটি লক্ষ্য করার মতো কারণ এই প্রশ্নটি বেশিরভাগই নতুন আইওএস দেব দ্বারা অনুসন্ধান করা হয় যারা বিজ্ঞপ্তি শ্রোতাদের তাদের প্রয়োজনের চেয়ে বেশি সময় ধরে বাঁচিয়ে রাখে। এখন আরকের সাহায্যে আপনি সাধারণত ডেলোক ব্যবহার করেন না এবং ফলস্বরূপ কেউ কেউ ভাবেন যে তাদের শ্রোতাদের মুক্তি দিতে হবে না।
লাইভ

7
এটি উল্লেখ [super dealloc]করার মতোও হতে পারে যে ডিলোক-পদ্ধতিতে কলটি আরসি এর অধীনে অনুমোদিত নয়; বাকি সব ভাল।
tommys

1
বিজ্ঞপ্তিটি আগুন লাগলে এবং পর্যবেক্ষক না থাকলে কী হবে? বিজ্ঞপ্তি হারিয়ে গেছে? অথবা এটি কোনও নতুন পর্যবেক্ষকের কাছে পাঠানোর জন্য প্রস্তুত কোথাও "সংরক্ষিত" (পরে তৈরি করা হয়েছে)?
সুপারপুসিও

226

ড্রিমলাক্সের উদাহরণটি প্রসারিত করার জন্য ... আপনি যদি বিজ্ঞপ্তি সহ ডেটা প্রেরণ করতে চান

পোস্টিং কোডে:

NSDictionary *userInfo = 
[NSDictionary dictionaryWithObject:myObject forKey:@"someKey"];
[[NSNotificationCenter defaultCenter] postNotificationName: 
                       @"TestNotification" object:nil userInfo:userInfo];

পর্যবেক্ষণ কোডে:

- (void) receiveTestNotification:(NSNotification *) notification {

    NSDictionary *userInfo = notification.userInfo;
    MyObject *myObject = [userInfo objectForKey:@"someKey"];
}

টেস্টনোটিকেশন অবশ্যই এনএসএস স্ট্রিং টাইপ হতে হবে। এটি কি এনএসনোটফিকেশন উদাহরণস্বরূপ?
রোমানহাউস

1
আমি প্রাপ্তি selfটেস্টনোটিকেশন পদ্ধতিতে পর্যবেক্ষক অ্যাক্সেস করতে পারি ?
কেন

হ্যাঁ কেন. রিসিভটেষ্টনোটিকেশন একটি উদাহরণ পদ্ধতি এবং আপনার নিজের মধ্যে এটির মাধ্যমে নিজেই অ্যাক্সেস পাবেন।
মাইকেল পিটারসন

এটাই. আমি রিসিভার পদ্ধতি থেকে ইউজারআইএনফো পেতে একটি উপায় খুঁজছিলাম।
হাসান

দেখে মনে হচ্ছে যে সমস্ত পর্যবেক্ষক ধারণা সমস্ত ক্ষেত্রে আচ্ছাদন করে না। অ্যাপ্লিকেশনটি কখন কাজ করে না। বন্ধ হয়ে গিয়েছিল এবং বিজ্ঞপ্তি ফর্মটি বিজ্ঞপ্তি কেন্দ্রটি ট্যাপ হয়ে যায়। পর্যবেক্ষক পদ্ধতি কল করা হয় না।
হাসান

49

এই আমাকে সাহায্য করেছে:

// Add an observer that will respond to loginComplete
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(showMainMenu:) 
                                                 name:@"loginComplete" object:nil];


// Post a notification to loginComplete
[[NSNotificationCenter defaultCenter] postNotificationName:@"loginComplete" object:nil];


// the function specified in the same class where we defined the addObserver
- (void)showMainMenu:(NSNotification *)note {
    NSLog(@"Received Notification - Someone seems to have logged in"); 
}

সূত্র: http://www.smipple.net/snippet/Sounden/Simple%20NSNotificationsCenter%20 উদাহরণ


আমার জন্য কাজ! ধন্যবাদ
রক্ষিতা মুরঙ্গা রডরিগো

48

ব্লক ব্যবহারের সম্ভাবনাও রয়েছে:

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[[NSNotificationCenter defaultCenter] 
     addObserverForName:@"notificationName" 
     object:nil
     queue:mainQueue
     usingBlock:^(NSNotification *notification)
     {
          NSLog(@"Notification received!");
          NSDictionary *userInfo = notification.userInfo;

          // ...
     }];

অ্যাপলের ডকুমেন্টেশন


1
এটি আমার উত্তরের একটি ভাল আপডেট যা এখন মোটামুটি পুরানো। ভূমিকা বা এআরসি এবং ব্লক সহ, বিজ্ঞপ্তি কেন্দ্রগুলি মোকাবেলা করা আরও সহজ are
ড্রিমলাক্স

5
আমিও তাই ভেবেছিলাম, তবে দেখা যাচ্ছে যে এটি সত্য হওয়াও খুব ভাল। এই ক্ষেত্রে আপনাকে এমন পর্যবেক্ষক ধরে রাখতে হবে যা অ্যাডঅবার্সার ফিরে আসে এবং পরে এটি অপসারণ করে, এটি একটি নতুন পদ্ধতি তৈরি করার মতো জটিল করে তোলে, যদি না হয় তবে। আরও তথ্য: toastmo.com/blog/2012/12/04/…
অ্যান্ড্রু

42

আপনি যদি নিজের ভিউ আপডেট করার জন্য এনএসএনটিফিকেশন সেন্টার ব্যবহার করেন, তবে মূল থ্রেড থেকে কল করে ভুলতে ভুলবেন না dispatch_async:

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"my_notification" object:nil];
});

1
এটি কি মূল সূত্র থেকে প্রবর্তিত নোটিফিকেশন পোস্ট বা যখন আপনি আসলে দৃশ্যটি আপডেট করেন ঠিক তখনই, পদ্ধতিটির অভ্যন্তরে আপনি মূল থ্রেডে প্রেরণিত বিজ্ঞপ্তিটি গ্রহণ করেন?
ক্র্যাশলোট

1
আপনি যে থ্রেড থেকে বিজ্ঞপ্তিটি প্রেরণ করেছেন তা হ'ল থ্রেডটি ফাংশনগুলি চালাচ্ছে এবং এভাবে ইউআই পরিবর্তন করার চেষ্টা করছে। আপনি ফাংশনগুলির অভ্যন্তরে মূল থ্রেডে প্রেরণটিও ব্যবহার করতে পারেন, ঠিক যেমন আপনি বলেছেন: ডি। একই ফলাফল হওয়া উচিত, আরও ভালভাবে অনুধাবন করা উচিত: ডি
ইরান

1
@ ইরান, আপনাকে অনেক ধন্যবাদ ভাই, আমি প্রেরণ_কেন্দ্রের ভিতরে লেখার পরে কেবল এটিই কাজ করেছিল
আরশাদ শাইক '

2

Newbies জন্য নির্বাচিত উত্তর 5.1 সুইট

class TestClass {
    deinit {
        // If you don't remove yourself as an observer, the Notification Center
        // will continue to try and send notification objects to the deallocated
        // object.
        NotificationCenter.default.removeObserver(self)
    }

    init() {
        super.init()

        // Add this instance of TestClass as an observer of the TestNotification.
        // We tell the notification center to inform us of "TestNotification"
        // notifications using the receiveTestNotification: selector. By
        // specifying object:nil, we tell the notification center that we are not
        // interested in who posted the notification. If you provided an actual
        // object rather than nil, the notification center will only notify you
        // when the notification was posted by that particular object.

        NotificationCenter.default.addObserver(self, selector: #selector(receiveTest(_:)), name: NSNotification.Name("TestNotification"), object: nil)
    }

    @objc func receiveTest(_ notification: Notification?) {
        // [notification name] should always be @"TestNotification"
        // unless you use this method for observation of other notifications
        // as well.

        if notification?.name.isEqual(toString: "TestNotification") != nil {
            print("Successfully received the test notification!")
        }
    }
}

... অন্য কোথাও অন্য কোথাও ...

 func someMethod(){
        // All instances of TestClass will be notified
        NotificationCenter.default.post(name: "TestNotification", object: self)
 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.