আমি কীভাবে সুইফটে একটি সম্পূর্ণতা হ্যান্ডলারের সাথে একটি ফাংশন তৈরি করতে পারি?


116

আমি কীভাবে এটার কাছে যাব তা সম্পর্কে আমি কেবল কৌতূহলী ছিলাম। আমার যদি কোনও ফাংশন থাকে এবং আমি পুরোপুরি সম্পাদিত হওয়ার পরে কিছু ঘটতে চাইতাম, তবে আমি কীভাবে এটিকে ফাংশনটিতে যুক্ত করব? ধন্যবাদ


2
ইউটিউবে একটি আশ্চর্যজনক ভিডিও রয়েছে: google.com/…
উজ্জ্বল ভবিষ্যত

উত্তর:


174

বলুন নেটওয়ার্ক থেকে কোনও ফাইল ডাউনলোড করার জন্য আপনার কাছে ডাউনলোড ফাংশন রয়েছে এবং ডাউনলোডের কাজ শেষ হয়ে গেলে আপনাকে বিজ্ঞপ্তি দিতে চান।

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

// How to use it.

downloadFileFromURL(NSURL(string: "url_str")!, { (success) -> Void in

    // When download completes,control flow goes here.
    if success {
        // download success
    } else {
        // download fail
    }
})

আশা করি এটা সাহায্য করবে.


2
এটি দুর্দান্ত কাজ করবে তবে কৌতূহলের বাইরে আমি ভাবছিলাম যে আপনি যদি কোনওভাবেই আপনার ফাংশনটিতে একটি সম্পূর্ণ হ্যান্ডলার লিখতে পারেন write
traw1233

1
হাই ফ্লাকস, আমি অন্য ফাংশন থেকে এই কমপ্লিটহ্যান্ডলারকে কল করতে চাই যাতে এটি কীভাবে অর্জন করা যায় ??
হিমাংশু জামনানী

উদ্দেশ্য সি এর জন্য কোনও উদাহরণ
এক্সকডিয়ান সোলঙ্গি

আমি যখন এটি অন্য শ্রেণীর দ্বারা বলি তখন এটি পরিপন্থী হ্যান্ডলার সাফল্যের পরামিতি বপন করে না।
চাঁদনি

85

উত্তরগুলি বুঝতে আমার সমস্যা হয়েছিল তাই আমি ধরে নিচ্ছি যে আমার মতো অন্য কোনও শিক্ষানবিশও আমার মতো একই সমস্যা হতে পারে।

আমার সমাধান শীর্ষের উত্তরের মতোই করে তবে আশা করি প্রাথমিকভাবে বা সাধারণভাবে বুঝতে সমস্যা হওয়া লোকদের জন্য কিছুটা আরও স্পষ্ট এবং বুঝতে সহজ।

একটি সম্পূর্ণতা হ্যান্ডলার সহ একটি ফাংশন তৈরি করতে

func yourFunctionName(finished: () -> Void) {

     print("Doing something!")

     finished()

}

ফাংশন ব্যবহার করতে

     override func viewDidLoad() {

          yourFunctionName {

          //do something here after running your function
           print("Tada!!!!")
          }

    }

আপনার আউটপুট হবে

কিছু করা

Tada !!!

আশাকরি এটা সাহায্য করবে!


80

সরল সুইফ্ট ৪.০ উদাহরণ:

func method(arg: Bool, completion: (Bool) -> ()) {
    print("First line of code executed")
    // do stuff here to determine what you want to "send back".
    // we are just sending the Boolean value that was sent in "back"
    completion(arg)
}

এটি কিভাবে ব্যবহার করতে:

method(arg: true, completion: { (success) -> Void in
    print("Second line of code executed")
    if success { // this will be equal to whatever value is set in this method call
          print("true")
    } else {
         print("false")
    }
})

12

আমরা এই উদ্দেশ্যে ক্লোজারগুলি ব্যবহার করতে পারি । নিম্নলিখিত চেষ্টা করুন

func loadHealthCareList(completionClosure: (indexes: NSMutableArray)-> ()) {
      //some code here
      completionClosure(indexes: list)
}

কিছু সময় আমরা নীচে দেওয়া হিসাবে এই ফাংশন কল করতে পারেন।

healthIndexManager.loadHealthCareList { (indexes) -> () in
            print(indexes)
}

বন্ধ সম্পর্কিত আরও তথ্যের জন্য দয়া করে নীচের লিঙ্কটি দেখুন ।

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html


5

সুইফ্ট 5.0 +, সাধারণ এবং শর্ট

উদাহরণ:

স্টাইল 1

    func methodName(completionBlock: () -> Void)  {

          print("block_Completion")
          completionBlock()
    }

স্টাইল 2

    func methodName(completionBlock: () -> ())  {

        print("block_Completion")
        completionBlock()
    }

ব্যবহার করুন:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        methodName {

            print("Doing something after Block_Completion!!")
        }
    }

আউটপুট

block_Completion

ব্লক_কম্পিশনের পরে কিছু করছে !!


0

আমি কাস্টম মেড কমপ্লিট হ্যান্ডলারগুলি সম্পর্কে কিছুটা বিভ্রান্ত। আপনার উদাহরণে:

বলুন নেটওয়ার্ক থেকে কোনও ফাইল ডাউনলোড করার জন্য আপনার কাছে ডাউনলোড ফাংশন রয়েছে এবং ডাউনলোডের কাজ শেষ হয়ে গেলে আপনাকে বিজ্ঞপ্তি দিতে চান।

typealias CompletionHandler = (success:Bool) -> Void

func downloadFileFromURL(url: NSURL,completionHandler: CompletionHandler) {

    // download code.

    let flag = true // true if download succeed,false otherwise

    completionHandler(success: flag)
}

আপনার // download codeইচ্ছামত এখনও অবিচ্ছিন্নভাবে চালানো হবে। কেন কোড আপনার সরাসরি যেতে হবে না let flag = trueএবং completion Handler(success: flag)সমাপ্ত করা আপনার ডাউনলোড কোডের জন্য অপেক্ষা না করেই?


শেষ পর্যন্ত, কিছু বসতে হবে এবং কোডটি চালানোর জন্য অপেক্ষা করতে হবে, এটি পুরো পথে নিচে অ্যাসিঙ্ক্রোনাস হাতির একটি বিশাল মিনার নয়। "অ্যাসিঙ্ক্রোনালি রান" মানে দুটি থ্রেড রয়েছে। তাদের মধ্যে একটি বসে বসে কাজটি করার জন্য অপেক্ষা করে, অন্যটি বহন করে এবং না করে। কাজটি সম্পন্ন থ্রেডের শেষে সমাপ্তি হ্যান্ডলারটি কল করা হয় বা কমপক্ষে কল করার জন্য নির্ধারিত হয়।
ক্রোম্যান 1

0

উপরে ছাড়াও: ট্রেলিং বন্ধ ব্যবহার করা যেতে পারে।

downloadFileFromURL(NSURL(string: "url_str")!)  { (success) -> Void in

  // When download completes,control flow goes here.
  if success {
      // download success
  } else {
    // download fail
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.