সুইডিতে জিসিডি মূল থ্রেডের পরামিতিগুলির সাথে কীভাবে কল করতে হবে?


192

আমার অ্যাপ্লিকেশনটিতে আমার একটি ফাংশন রয়েছে যা একটি এনএসআরএলআরএলসেশন তৈরি করে এবং একটি এনএসআরএল অনুরোধ প্রেরণ করে প্রেরণ করে

sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)

এই কাজের জন্য সমাপ্তি ব্লকে, আমাকে কিছু গণনা করা দরকার যা কলিং ভিউকন্ট্রোলারের সাথে একটি ইউআইআইমেজ যুক্ত করে। আমার কাছে একটি ফানক ফোন আছে

func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)

এটি ইউআইআইমেজ-সংযোজন গণনা করে। যদি আমি সমাপ্তি ব্লকের ভিতরে ভিউ-এডিং কোডটি চালানোর চেষ্টা করি তবে এক্সকোড একটি ত্রুটি ছুঁড়ে বলেছিল যে আমি একটি ব্যাকগ্রাউন্ড প্রক্রিয়া চলাকালীন লেআউট ইঞ্জিনটি ব্যবহার করতে পারি না। সুতরাং আমি এসও তে কিছু কোড পেয়েছি যা মূল থ্রেডে কোনও পদ্ধতির সারি করার চেষ্টা করে:

let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))

dispatch_after(time, dispatch_get_main_queue(), {
    let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})

তবে, এই ফাংশন কলটিতে "রিসিভএড্ডার" এবং "পরিমাণ বিটিসি" পরামিতিগুলি কীভাবে যুক্ত করবেন তা আমি জানি না। আমি এটি কীভাবে করব, বা কেউ অ্যাপ্লিকেশনের মূল কাতারে একটি পদ্ধতি কল যুক্ত করার জন্য সর্বোত্তম উপায়ের পরামর্শ দিতে পারেন?

উত্তর:


496

DispatchQueue.main.asyncমূল থ্রেডে প্রেরণের জন্য সুইফ্টের আধুনিক সংস্করণগুলি :

DispatchQueue.main.async { 
  // your code here
}

করার পর প্রাণবধ প্রধান কিউ, ব্যবহার করুন:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
  // your code here
}

ব্যবহৃত সুইফটের পুরানো সংস্করণ:

dispatch_async(dispatch_get_main_queue(), {
  let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
  delegateObj.addUIImage("yourstring")
})

আপনার পরামর্শটি কার্যকর হয়েছে এমন আপনি ঠিক থাকলেও আমার উত্তরটি কিছুটা ভাল বলে আমি মনে করি কারণ এটি ইউআইএপ্লিকেশন.শারড অ্যাপ্লিকেশনটিতে কোনও কল দেয় না যা অস্বাভাবিক এবং এটি আমার কোডের অন্যান্য পাঠককে ফেলে দিতে পারে। আমার উত্তরের ক্ষেত্রটি গুরুত্বের বিষয়গুলিতে সীমাবদ্ধ, যখন আপনার আনুষাঙ্গিক জিনিসগুলি নিয়ে আসে যা আমাকে ঠিক কী করছে তা শিখতে আমাকে আরও ডক্স পড়তে হবে। এবং আমি সঠিক ফাংশন কলটি রাখতে আমার মূল প্রশ্নটি সম্পাদনা করেছি। আমি ভেবেছিলাম ডিসপ্লে কিউ কোডটি নির্দিষ্টভাবে সুনির্দিষ্ট ছিল না তবে আমাদের মন্তব্যে এখন তা। যে ইশারা জন্য ধন্যবাদ।
almel

84

সুইফট 3+ এবং সুইফ্ট 4 সংস্করণ:

DispatchQueue.main.async {
    print("Hello")
}

সুইফট 3 এবং এক্সকোড 9.2:

dispatch_async_on_main_queue {
    print("Hello")
}

15

সুইফট 2

ট্রেলিং বন্ধ ব্যবহার করে এটি হয়ে যায়:

dispatch_async(dispatch_get_main_queue()) {
    self.tableView.reloadData()
}

ট্রেলিং ক্লোজারগুলি হ'ল সুইফট সিনট্যাকটিক চিনি যা ফাংশন প্যারামিটার স্কোপের বাইরে ক্লোজারটিকে সংজ্ঞায়িত করতে সক্ষম করে। আরও তথ্যের জন্য দেখুন সুইফট ২.২ প্রোগ্রামিং ভাষা নির্দেশিকাতে ট্রিলিং বন্ধ রয়েছে।

Dispatch_async যদি এপিআই func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)যেহেতু dispatch_block_tজন্য টাইপ ওরফে হয় () -> Voidএকটি অবসান যে 0 পরামিতি গ্রহণ করে এবং একটি ফেরত মান নেই, এবং ব্লক ফাংশনের গত প্যারামিটার হচ্ছে আমরা বাইরের সুযোগ অবসান সংজ্ঞায়িত করতে পারেন - dispatch_async


1
ঠিক তিনটি লাইনই আমি খুঁজছিলাম ... এখন আপনি আমার মন পড়া বন্ধ করতে পারেন
লাসজলো


7

অন্যান্য উত্তরের মতো একই ফলাফল অর্জনের জন্য এখানে সুন্দর (আইএমও) সুইফটি / কোকো স্টাইল সিনট্যাক্স রয়েছে:

NSOperationQueue.mainQueue().addOperationWithBlock({
    // Your code here
})

অথবা আপনি এমনকি কম কোড এবং আরও কার্যকারিতা জন্য জনপ্রিয় Async সুইফট লাইব্রেরি দখল করতে পারে :

Async.main {
    // Your code here
}

পদ্ধতিটির নতুন নামকরণ করা হয়েছেOperationQueue.main.addOperation({ }
ফ্রস্টমর্ন

3

এটি করার যথাযথ উপায় হ'ল মূল কোডটিতে ডিসপ্যাচ_সিএনসি ব্যবহার করা যেমন আমি নিম্নলিখিত কোডটিতে করেছিলাম

dispatch_async(dispatch_get_main_queue(), {
    (self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
})

2

এখানে একটি সুন্দর সামান্য গ্লোবাল ফাংশন আপনি একটি ভাল সিনট্যাক্স যুক্ত করতে পারেন:

func dispatch_on_main(block: dispatch_block_t) {
    dispatch_async(dispatch_get_main_queue(), block)
}

এবং ব্যবহার

dispatch_on_main {
    // Do some UI stuff
}

2
//Perform some task and update UI immediately.
DispatchQueue.global(qos: .userInitiated).async {  
    // Call your function here
    DispatchQueue.main.async {  
        // Update UI
        self.tableView.reloadData()  
    }
}

//To call or execute function after some time
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
    //Here call your function
}

//If you want to do changes in UI use this
DispatchQueue.main.async(execute: {
    //Update UI
    self.tableView.reloadData()
})

2

আপনি যদি ক্লোজারের অভ্যন্তরে স্ব ব্যবহার করছেন তবে নিজেকে দুর্বল করতে ভুলবেন না।

dispatch_async(dispatch_get_main_queue(),{ [weak self] () -> () in
    if let strongSelf = self {
        self?.doSomething()
    }
})

1
আমাদের দয়া করে কেন এটি করা উচিত তা দয়া করে ব্যাখ্যা করতে পারেন?
জ্যাকস্পিকার

এটি কারণ এটি মেমরি চক্র তৈরি করতে পারে - যেমন আমার কাছে কোনও কিছুর প্রতি দৃ strong় উল্লেখ রয়েছে এবং এটি আমার কাছে দৃ reference় উল্লেখ রয়েছে reference মানে আমরা দুজনই স্মৃতির apালু ছেড়ে যেতে পারি না।
জ্যাকোফালকোড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.