কীভাবে সুইফটে ব্যাকগ্রাউন্ড থ্রেড ব্যবহার করবেন?


329

কীভাবে সুইফটে থ্রেডিং ব্যবহার করবেন?

dispatchOnMainThread:^{

    NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));

}];

কোন অংশে রূপান্তর করতে আপনার সমস্যা আছে?
nschum

2
]শেষ লাইনে সেমিকোলনের আগে আপনার কেন আছে ?
আকাশীবস্কি

3
আপনি কোথায় আটকে আছেন বা আপনাকে কোন সাহায্যের প্রয়োজন তা ব্যাখ্যা করে আপনি সাহায্য করতে পারবেন।
nsuinteger

4
আপনার অবশ্যই সঠিক উত্তরটি গ্রহণ করতে হবে যদি তা সত্যিই আপনাকে সহায়তা করে তবে এটি অন্যকেও সঠিক সমাধান খুঁজে পেতে সহায়তা করবে।
অমিত সিং

DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
অনুরাগ শর্মা

উত্তর:


708

সুইফট 3.0+

সুইফট ৩.০ এ প্রচুর আধুনিকায়ন করা হয়েছে । ব্যাকগ্রাউন্ড থ্রেডে কিছু চালানো এইরকম দেখাচ্ছে:

DispatchQueue.global(qos: .background).async {
    print("This is run on the background queue")

    DispatchQueue.main.async {
        print("This is run on the main queue, after the previous code in outer block")
    }
}

সুইচ 1.2 থেকে 2.3

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    print("This is run on the background queue")

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        print("This is run on the main queue, after the previous code in outer block")
    })
})

প্রাক সুইফট ১.২ - জ্ঞাত সমস্যা

সুইফট 1.1 হিসাবে অ্যাপল কিছু পরিবর্তন ছাড়াই উপরের সিনট্যাক্সটিকে সমর্থন করে না। পাসিং QOS_CLASS_BACKGROUNDআসলে কাজ করে না, পরিবর্তে ব্যবহার করুন Int(QOS_CLASS_BACKGROUND.value)

আরও তথ্যের জন্য দেখুন অ্যাপল ডকুমেন্টেশন


23
এবং যদি কেউ সিনট্যাক্সের মতো আরও বেশি সুইফ্ট চায়, তবে আমি অ্যাসিঙ্ক তৈরি করেছি যা সিনট্যাক্সে কিছু চিনি যুক্ত করেছেAsync.background {}
টোবিয়াসডেম

আমি আপনার কোডটি xCode 6.0.1 এ ব্যবহার করছি এবং আইওএস 8. এটি "QOS_CLASS_BACKGROUND" রিটার্ন ক্লাস হিসাবে ত্রুটি দেয় এবং এটি UInt32 টাইপ হয় এবং টাইপ ত্রুটি আসছে বলে টাইপ ত্রুটি আসার কারণে 1 ম প্যারামিটার প্রয়োজন requires
জালাক প্যাটেল

সুতরাং Xcode 6.1.1 এ আমি কেবল সাধারণ সরল "QOS_CLASS_BACKGROUND" ব্যবহার করার জন্য একটি ত্রুটি পাচ্ছি না। এটা ঠিক আছে?
লুকাস গুসেন

@ লুকাস গুসসেন হ্যাঁ, এটি ঠিক করা হয়েছে। আমি সেই অনুযায়ী পোস্ট আপডেট করেছি।
tobiasdm

1
@ নিকিতাপ্রনচিক এই উত্তর থেকে পরিষ্কার নয়? অন্য এটিতে একটি সম্পাদনা করতে নির্দ্বিধায়।
tobiasdm

123

সর্বোত্তম অনুশীলন হ'ল পুনরায় ব্যবহারযোগ্য ফাংশনটি সংজ্ঞায়িত করা যা একাধিকবার অ্যাক্সেস করা যায়।

পুনরায় ব্যবহারযোগ্য কাজ:

যেমন গ্লোবাল ফাংশন হিসাবে কোথাও অ্যাপডেলিগেট.সভিট।

func backgroundThread(_ delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) {
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
        background?()

        let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
        dispatch_after(popTime, dispatch_get_main_queue()) {
            completion?()
        }
    }
}

দ্রষ্টব্য: সুইফট 2.0 এ, প্রতিস্থাপন QOS_CLASS_USER_INITIATED.value সাথে উপরে QOS_CLASS_USER_INITIATED.rawValue পরিবর্তে

ব্যবহার:

উ: ব্যাকগ্রাউন্ডে 3 সেকেন্ডের বিলম্বের সাথে একটি প্রক্রিয়া চালাতে:

    backgroundThread(3.0, background: {
            // Your background function here
    })

বি। পটভূমিতে কোনও প্রক্রিয়া চালানোর জন্য অগ্রভাগে একটি সমাপ্তি চালান:

    backgroundThread(background: {
            // Your function here to run in the background
    },
    completion: {
            // A function to run in the foreground when the background thread is complete
    })

গ। 3 সেকেন্ড দেরি করতে - ব্যাকগ্রাউন্ড প্যারামিটার ছাড়াই সমাপ্তি প্যারামিটারের নোট ব্যবহার করুন:

    backgroundThread(3.0, completion: {
            // Your delayed function here to be run in the foreground
    })

1
সুন্দর স্নিপেট, সঠিক উত্তর হওয়া উচিত। @ ডেল ক্লিফোর্ড
লোভো

নিম্ন স্তরের সি লাইব্রেরি থেকে পুরানো সময়ের জিসিডি পদ্ধতিগুলি অ্যাক্সেস করার জন্য উজ্জ্বল উচ্চ স্তরের আধুনিক সুইফট-ওয় অ্যাপ্রোচ। সুইফটে স্ট্যান্ডার্ড আসা উচিত।
ক্রেগ গ্রুমিট

2
খুব সুন্দর. আপনি দয়া করে নিশ্চিত করতে পারেন, বিলম্বটি কেবলমাত্র সমাপ্তি ব্লকের জন্য কাজ করে। সুতরাং এর অর্থ হ'ল এ এর ​​বিলম্বের কোনও প্রভাব নেই এবং ব্যাকগ্রাউন্ড ব্লকটি দেরি না করে অবিলম্বে কার্যকর করে।
উদ্দেশ্যসিটিপি

1
আপনি কিছুটা সুইফিয়ার সিনট্যাক্সের if(background != nil){ background!(); }সাথে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত background?()?
সাইমন বেঙ্গস্টন

1
আপনি দয়া করে সুইফট 3 এর জন্য এটি আপডেট করতে পারেন? স্বয়ংক্রিয় রূপান্তরকারী এটিকে রূপান্তরিত করেছে DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {তবে এটি এর মতো একটি ত্রুটি ছুঁড়ে cannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'। কাজ সমাধান পাওয়া যায় এখানে ( DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async)।
Dev-iL

111

ড্যান বিউলিউয়ের উত্তর সুইফট 5-তে (এছাড়াও সুইফট ৩.০.১ থেকে কার্যকর)।

সুইফ্ট 5.0.1

extension DispatchQueue {

    static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) {
        DispatchQueue.global(qos: .background).async {
            background?()
            if let completion = completion {
                DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
                    completion()
                })
            }
        }
    }

}

ব্যবহার

DispatchQueue.background(delay: 3.0, background: {
    // do something in background
}, completion: {
    // when background job finishes, wait 3 seconds and do something in main thread
})

DispatchQueue.background(background: {
    // do something in background
}, completion:{
    // when background job finished, do something in main thread
})

DispatchQueue.background(delay: 3.0, completion:{
    // do something in main thread after 3 seconds
})

আশ্চর্যজনক, সুইফট 3.0.1 ফর্ম্যাটে এত সুন্দরভাবে আপডেট করার জন্য আপনাকে ধন্যবাদ!
ডেল ক্লিফোর্ড

1
আমি কোনও জীবিত ব্যক্তির চেয়ে বেশি এক্সটেনশন ব্যবহার করি। তবে এক্সটেনশনটি ব্যবহারের ক্ষেত্রে আসল বিপদ রয়েছে যা আসল থেকে আলাদা নয়!
ফ্যাটি

@ ফ্রুও খুব মার্জিত, যখন 4 অ্যাসিঙ্ক কলটি শেষ করে তখন কি কোনও সমাপ্তি হ্যান্ডলার যুক্ত করা সম্ভব? আমি এটি কিছুটা অফ-টপিক জানি।
এনিস্ট

1
হ্যাঁ লিংকটি ভুলে যাও আপনার যা দরকার তা হ'ল একটি প্রেরণ দল - এটি খুব সহজ; কোন চিন্তা নেই!
ফ্যাটি

1
@ দিলিপ জাঙ্গিদ আপনি করতে পারবেন না, যদি না আপনার backgroundবন্ধের কাজটি খুব দীর্ঘ হয় ( inf = অসীম)। এই পদ্ধতিটি সীমাবদ্ধ সময়ের জন্য স্থায়ী হয়: আপনার পটভূমির কাজটি কার্যকর করার সময়টি দরকার। সুতরাং, completionআপনার পটভূমির কাজ সম্পাদনের সময় + বিলম্ব হওয়ার সাথে সাথেই ক্লোজার বলা হবে।
frouo

42

সুইফট 3 সংস্করণ

স্যুইফট 3 DispatchQueueসারি এবং থ্রেড পরিচালনা করতে নতুন শ্রেণি ব্যবহার করে । পটভূমি থ্রেডে কিছু চালানোর জন্য আপনি ব্যবহার করবেন:

let backgroundQueue = DispatchQueue(label: "com.app.queue", qos: .background)
backgroundQueue.async {
    print("Run on background thread")
}

অথবা আপনি যদি দুটি লাইনের কোডটিতে কিছু চান:

DispatchQueue.global(qos: .background).async {
    print("Run on background thread")

    DispatchQueue.main.async {
        print("We finished that.")
        // only back on the main thread, may you access UI:
        label.text = "Done."
    }
}

আপনি এই টিউটোরিয়ালে জিডিসি সম্পর্কে সুইফট 3-তে কিছু গভীরতা সম্পর্কিত তথ্য পেতে পারেন ।


ড। যেহেতু আপনার উত্তরটি সর্বোত্তম, তাই আপনি "শেষ হয়ে গেলে কীভাবে ফিরে আসবেন" তা দেখিয়ে আমি কোডের একটি লাইনে ফেলে দিয়েছি। উদ্বিগ্ন বা সম্পাদনা মুক্ত মনে করুন, চিয়ার্স
ফ্যাটি

35

থেকে জেমসন Quave এর টিউটোরিয়াল

সুইফট 2

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    //All stuff here
})

3
শুধু স্পষ্টতার জন্য, কেন এটি গৃহীত উত্তরের পরিবর্তে ব্যবহৃত হবে? এটি কি কেবল পুরানো এপিআই?
সাইরেনস

1
@Sirens আমি এই খুব দরকারী হবে মনে হবে অ্যাপ্লিকেশান সমর্থনের জন্য <আইওএস 8.
bperdue

প্রক্রিয়াগুলি বলপূর্বক আইওএস 8.2 এর জন্য আমি এটি ব্যবহার করি।
λαβέ.λαβέ

DISPATCH_QUEUE_PRIORITY_DEFAULT QOS_CLASS_DEFAULT এ ফিরে আসে। সুতরাং আমার ধারণা আপনি এটি বলতে পারেন এটি আরও উচ্চ স্তরের / গৃহীত সিনট্যাক্স।
পোস্টকোডিজম

34

সুইফটে 4.2 এবং এক্সকোড 10.1

আমাদের তিন ধরণের কুইউ রয়েছে:

১. প্রধান সারি: মূল সারি একটি ক্রমিক সারি যা সিস্টেম তৈরি করে এবং অ্যাপ্লিকেশন মূল থ্রেডের সাথে যুক্ত।

২. গ্লোবাল কিউ: গ্লোবাল কিউ হ'ল একটি যুগ্ম কাত যা আমরা কাজের অগ্রাধিকারের প্রতি শ্রদ্ধার সাথে অনুরোধ করতে পারি।

৩. কাস্টম সারি: ব্যবহারকারীর দ্বারা তৈরি করা যেতে পারে। কাস্টম সমবর্তী সারিবদ্ধগুলি সর্বদা বিশ্বব্যাপী সারিতে একটি মান মানের পরিষেবার সম্পত্তি (QoS) নির্দিষ্ট করে ম্যাপ করে pped

DispatchQueue.main//Main thread
DispatchQueue.global(qos: .userInitiated)// High Priority
DispatchQueue.global(qos: .userInteractive)//High Priority (Little Higher than userInitiated)
DispatchQueue.global(qos: .background)//Lowest Priority
DispatchQueue.global(qos: .default)//Normal Priority (after High but before Low)
DispatchQueue.global(qos: .utility)//Low Priority
DispatchQueue.global(qos: .unspecified)//Absence of Quality

এই সমস্ত সারি দুটি উপায়ে কার্যকর করা যেতে পারে

1. সিঙ্ক্রোনাস এক্সিকিউশন

2. অ্যাসিঙ্ক্রোনাস কার্যকর

DispatchQueue.global(qos: .background).async {
    // do your job here
    DispatchQueue.main.async {
        // update ui here
    }
}

//Perform some task and update UI immediately.
DispatchQueue.global(qos: .userInitiated).async {  
    // Perform task
    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()
})

অ্যাপকোডা থেকে: https://www.appcoda.com/grand-central-dispatch/

//This will print synchronously means, it will print 1-9 & 100-109
func simpleQueues() {
    let queue = DispatchQueue(label: "com.appcoda.myqueue")

    queue.sync {
        for i in 0..<10 {
            print("🔴", i)
        }
    }

    for i in 100..<110 {
        print("Ⓜ️", i)
    }
}

//This will print asynchronously 
func simpleQueues() {
    let queue = DispatchQueue(label: "com.appcoda.myqueue")

    queue.async {
        for i in 0..<10 {
            print("🔴", i)
        }
    }

    for i in 100..<110 {
        print("Ⓜ️", i)
    }
}

1
থ্রেডগুলির জন্য সেরা টিউটোরিয়াল মিডিয়াম.com
আইওএস

আপনি .background কিউওএস ব্যবহার করার সময় আমি কোনও পরিবর্তন দেখতে পেলাম না .userInitiatedতবে আমার জন্য এটি কার্যকর হয়েছিল.background
মরচে

24

সুইফট 4.x

এটি কোনও ফাইলে রাখুন:

func background(work: @escaping () -> ()) {
    DispatchQueue.global(qos: .userInitiated).async {
        work()
    }
}

func main(work: @escaping () -> ()) {
    DispatchQueue.main.async {
        work()
    }
}

এবং তারপরে যেখানে আপনার প্রয়োজন সেখানে কল করুন:

background {
     //background job
     main {
       //update UI (or what you need to do in main thread)
     }
}

22

আপনি যে পরিবর্তনগুলি ইউআইতে চালাতে চান সেগুলি থেকে পটভূমিতে আপনি যে পরিবর্তনগুলি চালাতে চান তা আলাদা করতে হবে:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    // do your task

    dispatch_async(dispatch_get_main_queue()) {
        // update some UI
    }
}

সুতরাং dispatch_async(dispatch_get_main_queue()) { // update some UI }যখন বলা হয় ব্যাকগ্রাউন্ড স্টেটমেন্ট (আউটার ব্লক) সম্পাদন করা হয়?
justlpbs

এটি কি কেবল সুইফট ২.৩ এবং এর জন্য নয়?
সুরজ

9

ভাল উত্তর যদিও, যাইহোক আমি আমার অবজেক্ট ওরিয়েন্টেড সমাধানটি দ্রুততম 5-এর জন্য আপ টু ডেট শেয়ার করতে চাই ।

দয়া করে এটি পরীক্ষা করে দেখুন: অ্যাসিঙ্কটাস্ক

অ্যানড্রয়েডের অ্যাসিঙ্কটাস্ক থেকে ধারণাগতভাবে অনুপ্রাণিত হয়ে আমি সুইফটে আমার নিজস্ব ক্লাস লিখেছি

AsyncTask ইউআই থ্রেডটির যথাযথ এবং সহজ ব্যবহার সক্ষম করে। এই শ্রেণিটি ব্যাকগ্রাউন্ড ক্রিয়াকলাপ সম্পাদন করতে এবং ইউআই থ্রেডে ফলাফল প্রকাশের অনুমতি দেয়।

এখানে ব্যবহারের কয়েকটি উদাহরণ রয়েছে

উদাহরণ 1 -

AsyncTask(backgroundTask: {(p:String)->Void in//set BGParam to String and BGResult to Void
        print(p);//print the value in background thread
    }).execute("Hello async");//execute with value 'Hello async'

উদাহরণ 2 -

let task2=AsyncTask(beforeTask: {
           print("pre execution");//print 'pre execution' before backgroundTask
        },backgroundTask:{(p:Int)->String in//set BGParam to Int & BGResult to String
            if p>0{//check if execution value is bigger than zero
               return "positive"//pass String "poitive" to afterTask
            }
            return "negative";//otherwise pass String "negative"
        }, afterTask: {(p:String) in
            print(p);//print background task result
    });
    task2.execute(1);//execute with value 1

এটিতে 2 জেনেরিক প্রকার রয়েছে:

  • BGParam - কার্যকর করার পরে টাস্কে পাঠানো প্যারামিটারের ধরণ।
  • BGResult - পটভূমি গণনার ফলাফলের ধরণ।

    আপনি যখন অ্যাসিঙ্কটাস্ক তৈরি করেন আপনি সেই ধরণের প্রকারগুলি আপনার পটভূমির কাজটি বাইরে যেতে এবং আউট করার প্রয়োজনে করতে পারেন তবে আপনার যদি এই ধরণের প্রয়োজন না হয় তবে আপনি এটিকে কেবল এটির সাথে সেট করে: Voidবা আরও সংক্ষিপ্ত বাক্য গঠন সহ চিহ্নিত করতে পারেন :()

যখন একটি অ্যাসিঙ্ক্রোনাস টাস্ক কার্যকর করা হয়, তখন এটি 3 টি ধাপের মধ্য দিয়ে যায়:

  1. beforeTask:()->Void টাস্কটি কার্যকর হওয়ার ঠিক আগে ইউআই থ্রেডে অনুরোধ করা হয়েছে।
  2. backgroundTask: (param:BGParam)->BGResult এরপরেই পটভূমির থ্রেডে অনুরোধ করা হয়েছিল
  3. afterTask:(param:BGResult)->Void ব্যাকগ্রাউন্ড টাস্কের ফলাফল সহ ইউআই থ্রেডের প্রতি অনুরোধ জানানো হয়েছে

4
এটি আমার জন্য আশ্চর্যজনকভাবে কাজ করে। ভালো কাজ, গিথুব লাগিয়ে দিচ্ছেন না কেন?
36 ডিজাইন দ্বারা

8

যেহেতু ওপি প্রশ্নের উত্তর ইতিমধ্যে উপরে দেওয়া হয়েছে আমি কেবল কিছু গতি বিবেচনা যুক্ত করতে চাই:

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

এটি একটি কম্পিউটেশনাল ইনটেনসিভ ফাংশন থেকে কিছু আসল তথ্য যা একটি এক্সএমএল ফাইল (বাফারিং সহ) থেকে পড়ে এবং ডেটা ইন্টারপোলেশন সম্পাদন করে:

ডিভাইস নাম / .background / .utility / .default / .userInitiated / .userInteractive

  1. আইফোন এক্স: 18.7 এস / 6.3 এস / 1.8 এস / 1.8 এস / 1.8 এস
  2. আইফোন 7: 4.6 এস / 3.1 এস / 3.0 এস / 2.8 এস / 2.6 এস
  3. আইফোন 5 এস: 7.3 এস / 6.1 এস / 4.0 এস / 4.0 এস / 3.8 এস

নোট করুন যে ডেটা সেটটি সমস্ত ডিভাইসের জন্য এক নয়। এটি আইফোন এক্সের মধ্যে বৃহত্তম এবং আইফোন 5 এস এর মধ্যে সবচেয়ে ছোট।


4

সুইফট 5

এটি সহজ করার জন্য, এই বিষয়বস্তু সহ একটি ফাইল "ডিসপ্যাচকিউ + এক্সটেনশনস.সুইফ্ট" তৈরি করুন:

import Foundation

typealias Dispatch = DispatchQueue

extension Dispatch {

    static func background(_ task: @escaping () -> ()) {
        Dispatch.global(qos: .background).async {
            task()
        }
    }

    static func main(_ task: @escaping () -> ()) {
        Dispatch.main.async {
            task()
        }
    }
}

ব্যবহার:

Dispatch.background {
    // do stuff

    Dispatch.main { 
        // update UI
    }
}

2

গ্র্যান্ড সেন্ট্রাল ডিসপ্যাচটি আমাদের আইওএস অ্যাপ্লিকেশনগুলিতে মাল্টিটাস্কিং পরিচালনা করতে ব্যবহৃত হয়।

আপনি এই কোড ব্যবহার করতে পারেন

// Using time interval

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1) {
    print("Hello World")
}

// Background thread
queue.sync {
     for i in 0..<10 {
          print("Hello", i)
     }
}

// Main thread
for i in 20..<30 {
     print("Hello", i)
}

আরও তথ্য এই লিঙ্কটি ব্যবহার করুন: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html


2

থ্রেড জন্য বহু উদ্দেশ্য ফাংশন

public enum QueueType {
        case Main
        case Background
        case LowPriority
        case HighPriority

        var queue: DispatchQueue {
            switch self {
            case .Main:
                return DispatchQueue.main
            case .Background:
                return DispatchQueue(label: "com.app.queue",
                                     qos: .background,
                                     target: nil)
            case .LowPriority:
                return DispatchQueue.global(qos: .userInitiated)
            case .HighPriority:
                return DispatchQueue.global(qos: .userInitiated)
            }
        }
    }

    func performOn(_ queueType: QueueType, closure: @escaping () -> Void) {
        queueType.queue.async(execute: closure)
    }

এটি ব্যবহার করুন:

performOn(.Background) {
    //Code
}

1

আমি ড্যান বিউলিউয়ের উত্তরটি সত্যিই পছন্দ করি তবে এটি সুইফট ২.২-এর সাথে কাজ করে না এবং আমি মনে করি আমরা এই ন্যক্কারজনক বাধ্যতামূলক আনার্যাপগুলি এড়াতে পারি!

func backgroundThread(delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) {

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {

        background?()

        if let completion = completion{
            let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC)))
            dispatch_after(popTime, dispatch_get_main_queue()) {
                completion()
            }
        }
    }
}

0
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
    // Conversion into base64 string
    self.uploadImageString =  uploadPhotoDataJPEG.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.EncodingEndLineWithCarriageReturn)
})

-3

সুইফটে 4.2 এ কাজ করে।

import Foundation

class myThread: Thread
{
    override func main() {
        while(true) {
            print("Running in the Thread");
            Thread.sleep(forTimeInterval: 4);
        }
    }
}

let t = myThread();
t.start();

while(true) {
    print("Main Loop");
    sleep(5);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.