অ্যাপ্লিকেশনলিডবিকোম্যাকটিভ হ্যান্ডলিং - "অ্যাপ্লিকেশানটি সক্রিয় হয়ে উঠতে কোনও দৃশ্য নিয়ন্ত্রণকারী কীভাবে প্রতিক্রিয়া জানাতে পারে?"


179

আমি UIApplicationDelegateসঙ্গে আমার মূল AppDelegate.m ক্লাসে প্রোটোকল applicationDidBecomeActiveপদ্ধতি বর্ণিত।

অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ড থেকে ফিরে আসার সময় আমি কোনও পদ্ধতিতে কল করতে চাই, তবে পদ্ধতিটি অন্য ভিউ কন্ট্রোলারে রয়েছে। বর্তমানে কী applicationDidBecomeActiveপদ্ধতিতে নিয়ামকটি পদ্ধতিতে প্রদর্শিত হচ্ছে তা আমি কীভাবে পরীক্ষা করতে পারি এবং তারপরে সেই নিয়ামকের মধ্যে থাকা কোনও পদ্ধতিতে কল করতে পারি?

উত্তর:


304

আপনার আবেদনের যে কোনও শ্রেণি অ্যাপ্লিকেশনটিতে বিভিন্ন বিজ্ঞপ্তির জন্য "পর্যবেক্ষক" হতে পারে। আপনি যখন নিজের ভিউ কন্ট্রোলার তৈরি করেন (বা লোড করেন), আপনি এটিকে পর্যবেক্ষক হিসাবে নিবন্ধিত করতে UIApplicationDidBecomeActiveNotificationএবং সেই বিজ্ঞপ্তিটি যখন আপনার অ্যাপ্লিকেশনটিতে প্রেরিত হয় তখন আপনি কোন পদ্ধতিটি কল করতে চান তা নির্দিষ্ট করতে চান।

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(someMethod:)
                                             name:UIApplicationDidBecomeActiveNotification object:nil];

নিজের পরে পরিষ্কার করতে ভুলবেন না! আপনার দৃষ্টিভঙ্গিটি চলে যাওয়ার সময় নিজেকে পর্যবেক্ষক হিসাবে অপসারণ করতে ভুলবেন না:

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification
                                              object:nil];

বিজ্ঞপ্তি কেন্দ্র সম্পর্কে আরও তথ্য ।


চমৎকার। ব্যবহারের কথা ভাবেননি NSNotificationCenter। ধন্যবাদ!
ক্যালভিন

3
কোডের সেই লাইনে কেবল একটি টাইপো ('নাম' নিখোঁজ): [[এনএসনিটিফিকেশন সেন্টার ডিফল্ট সেন্টার] অ্যাডঅবার্সার: স্ব-নির্বাচক: @ নির্বাচক (সামোথড :) নাম: ইউআইএপ্লিকেশনডিডব্যাকোঅ্যাক্টিভনোটিকেশন অবজেক্ট: নীল];
জনাস

3
রিডের উত্তরে যুক্ত করতে, যে পদ্ধতিকে বলা হয় (উদাহরণস্বরূপ এটি কিছুটা ম্যাথোড) একটি এনএসএনটিফিকেশন প্যারামিটার গ্রহণ করতে হবে। সুতরাং কোনও মেথোডের জন্য পদ্ধতিটির স্বাক্ষরটি হবে - (অকার্যকর) কিছু ম্যাথোড: (এনএসনিটিফিকেশন *) বিজ্ঞপ্তি {// এখানে কিছু করুন}
অ্যারন

2
@ অ্যারোন এটি করতে পারে, তবে এটির কোনও প্রয়োজন নেই। যদিও এটি দুর্দান্ত অন্তর্দৃষ্টি। ধন্যবাদ!
রিড ওলসেন

ফ্যান্টাস্টিক! এই এনএসটিমারের জন্য দায়ী যারা নিয়ন্ত্রণকারী / অন্যান্য অবজেক্টের মধ্যে রয়েছে ঠিক তখনই এনটিএসটাইমার দৃষ্টান্তগুলি অকার্যকর / পুনরায় তৈরি করার কী দুর্দান্ত উপায়। এটা ভালবাসা!
idStar

68

সুইফট 3, 4 সমান:

পর্যবেক্ষক যোগ করা

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
    object: nil)

পর্যবেক্ষক অপসারণ

NotificationCenter.default.removeObserver(self,
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for swift 4.2+
    object: nil)

কলব্যাক

@objc func applicationDidBecomeActive() {
    // handle event
}

2
আমি এটাকে কোথায় ডাকব?

1
@ ব্যবহারকারী 8169082, আপনি যেখানেই বিজ্ঞপ্তি পেতে শুরু করতে হবে সেখানে পর্যবেক্ষক যুক্ত করুন। আপনি এটিতে viewDidLoadবা viewWillAppear:animatedউদাহরণ হিসাবে যুক্ত করতে পারেন । এবং আপনি যখন কোনও পর্যবেক্ষককে আর বিজ্ঞপ্তি ব্যবহারের প্রয়োজন নেই, বা আপনার পর্যবেক্ষক উদাহরণটি ডিনিট পদ্ধতিতে deallocated হতে চলেছেন তখন
Iigrek

2
swift 4.2 আমি ব্যবহার করছি: NotificationsCenter.default.addObserver (স্ব, নির্বাচনকারী: # নির্বাচনকারী (অ্যাপ্লিকেশনডিডকোমেকটিভ (নোটিফিকেশন :)), নাম: UIApplication.didBecomeActiveNotifications, অবজেক্ট: শূন্য)
ব্রায়ান

16

সুইফট 2 সমতুল্য :

let notificationCenter = NSNotificationCenter.defaultCenter()

// Add observer:
notificationCenter.addObserver(self,
  selector:Selector("applicationWillResignActiveNotification"),
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove observer:
notificationCenter.removeObserver(self,
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove all observer for all notifications:
notificationCenter.removeObserver(self)

// Callback:
func applicationWillResignActiveNotification() {
  // Handle application will resign notification event.
}

removeObserverসুইফটে রাখার জন্য সেরা স্থান : deinitপদ্ধতি।
এনরিকো সুসাত্তিও

সাধারণত, ডিনিট-এ স্ব-অ্যাক্সেস করার পরামর্শ দেওয়া হয় না; এই মুহুর্তে, স্ব সম্পূর্ণরূপে বরাদ্দ হওয়া এবং
অবনমিত

1
আপনি কোথায় ওভারসভার অপসারণ করবেন?
এনরিকো সুসাত্তিও

2
@ এনারিকো সুস্যাতিয়ো আপনি এটিকে উপেক্ষা করতে পারেন, কারণ এটি সঠিক নয়। ওভাররাইডিং ডিনিট ঠিক আছে: "কারণ কোনও উদাহরণ ডিনিটায়ালাইজার বলা না হওয়া অবধি অপসারণ করা হয় না, ডিনিটালাইজার তার যে উদাহরণটি বলা হয় তার সমস্ত বৈশিষ্ট্য অ্যাক্সেস করতে পারে এবং সেই বৈশিষ্ট্যগুলির উপর ভিত্তি করে তার আচরণটি পরিবর্তন করতে পারে (যেমন কোনও নামটির সন্ধান করা) ফাইলটি বন্ধ করা দরকার) "। ডিনিট কল করা ঠিক নেই
ড্যান রোজনস্টার্ক

7

সুইফট 4.2

পর্যবেক্ষক যুক্ত করুন-

NotificationCenter.default.addObserver(self, selector: #selector(handleEvent), name: UIApplication.didBecomeActiveNotification, object: nil)

পর্যবেক্ষক সরান-

NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)

হ্যান্ডেল ইভেন্ট-

@objc func handleEvent() {
}

5

সুইফট 4 এর সাথে, অ্যাপল একটি নতুন সংকলক সতর্কবার্তাটির মাধ্যমে পরামর্শ দেয় যে আমরা #selectorএই দৃশ্যের ব্যবহার এড়াতে পারি । এটি সম্পাদন করার জন্য নিম্নলিখিতটি আরও নিরাপদ উপায়:

প্রথমে একটি অলস ভার তৈরি করুন যা বিজ্ঞপ্তি দ্বারা ব্যবহার করা যেতে পারে:

lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
    // Do stuff
} 

আপনি অন্তর্ভুক্ত করা প্রকৃত প্রজ্ঞাপন প্রয়োজন হলে শুধু প্রতিস্থাপন _সঙ্গে notification

এরপরে, অ্যাপটি সক্রিয় হওয়ার জন্য আমরা বিজ্ঞপ্তিটি সেট আপ করি।

func setupObserver() {
    _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
                                               object: nil,
                                               queue:.main,
                                               using: didBecomeActive)
}

এখানে বড় পরিবর্তনটি হ'ল একটি #selectorকল করার পরিবর্তে , এখন আমরা উপরে তৈরি করা ভেরিকে কল করি। এটি এমন পরিস্থিতিগুলি দূর করতে পারে যেখানে আপনি অবৈধ নির্বাচক ক্র্যাশ পান।

অবশেষে, আমরা পর্যবেক্ষক অপসারণ।

func removeObserver() {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}

1
#selector@objcসুইফট 4-এ অ্যাট্রিবিউট হিসাবে ঘোষিত একটি পদ্ধতি কল করতে পারেন
অ্যানবিসউ

1
এটি ব্যবহার করা ভুল removeObserver(selfকারণ পর্যবেক্ষক যুক্ত করার সময় স্ব নির্ধারিত হয়নি। let observer = NotificationCenter.default.addObserverতারপরে আপনার উচিতremoveObserver(observer
ইয়ান কালবাস্কা

ধন্যবাদ @ কোডবেেন্ডার আমি এখনও সেই ফাংশনটি জানতাম না এবং এটি (শেষ পর্যন্ত) অপসারণ করে @objc। তবে আমি যখন এটি চেষ্টা করি তখন আমি কনসোলে একটি সতর্কতা পেয়েছি (এক্সকোড 11.3.1 (11 সি 504), সুইফট 13.3): ব্যাকগ্রাউন্ড টাস্কটি শেষ করা যায় না: সনাক্তকারী সহ কোনও পটভূমি টাস্ক বিদ্যমান নেই। এমনকি আমি যদি এনএসওজেক্টপ্রোটোকল হিসাবে কোনও ভেরিয়েবলে পর্যবেক্ষককে সংরক্ষণ করি।
পলেমে

আমি যদি @objcভেরিয়েন্টটি ব্যবহার করি তবে আমি সতর্কতাও পাই না m
পলেমে

3

সুইফট 5

fileprivate  func addObservers() {
      NotificationCenter.default.addObserver(self,
                                             selector: #selector(applicationDidBecomeActive),
                                             name: UIApplication.didBecomeActiveNotification,
                                             object: nil)
    }

fileprivate  func removeObservers() {
        NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
    }

@objc fileprivate func applicationDidBecomeActive() {
// here do your work
    }

0

একত্রিত উপায়:

import Combine

var cancellables = Set<AnyCancellable>()
NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)
    .sink { notification in
            // do stuff
    }.store(in: &cancellables)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.