คำถามติดแท็ก grand-central-dispatch

Grand Central Dispatch (GCD) มีกลไกที่เรียบง่ายและมีประสิทธิภาพสำหรับการทำงานพร้อมกันและแบบอะซิงโครนัสโดยเฉพาะในระบบปฏิบัติการ Apple (เช่น iOS, macOS, watchOS และ tvOS) แต่ยังรวมถึง FreeBSD และ MidnightBSD

18
คุณจะเรียกบล็อกหลังจากหน่วงเวลาเช่น -performSelector: withObject: afterDelay :?
มีวิธีการเรียกบล็อกพารามิเตอร์ดั้งเดิมหลังจากที่ล่าช้าเช่นการใช้performSelector:withObject:afterDelay:แต่มีข้อโต้แย้งเช่นint/ double/ float?


8
NSOperation กับ Grand Central Dispatch
ฉันเรียนรู้เกี่ยวกับการเขียนโปรแกรมพร้อมกันสำหรับ iOS จนถึงขณะนี้ผมได้อ่านเกี่ยวกับNSOperation/NSOperationQueueGCDและ อะไรคือสาเหตุของการใช้NSOperationQueueเกินGCDและในทางกลับกัน? เสียงเหมือนทั้งนามธรรมGCDและNSOperationQueueแยกออกไปสร้างที่ชัดเจนNSThreadsจากผู้ใช้ อย่างไรก็ตามความสัมพันธ์ระหว่างสองแนวทางนี้ไม่ชัดเจนสำหรับฉันดังนั้นข้อเสนอแนะใด ๆ ที่จะชื่นชม!

13
ฉันจะเขียน dispatch_after GCD ใน Swift 3, 4 และ 5 ได้อย่างไร
ใน Swift 2 ฉันสามารถใช้dispatch_afterเพื่อหน่วงเวลาการดำเนินการโดยใช้การส่งศูนย์กลางใหญ่: var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { // your function here }) แต่ตอนนี้ดูเหมือนว่าจะไม่รวบรวมอีกต่อไปตั้งแต่ Swift 3 วิธีที่ดีที่สุดในการเขียนสิ่งนี้ใน Swift ยุคใหม่คืออะไร?

15
วิธีสร้างคิวการส่งใน Swift 3
ใน Swift 2 ฉันสามารถสร้างคิวด้วยรหัสต่อไปนี้: let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) แต่นี่ไม่ได้รวบรวมใน Swift 3 วิธีที่ดีที่สุดในการเขียนสิ่งนี้ใน Swift 3 คืออะไร?

10
สร้างซิงเกิลตันโดยใช้ dispatch_once ของ GCD ใน Objective-C
หากคุณสามารถกำหนดเป้าหมาย iOS 4.0 ขึ้นไป การใช้ GCD เป็นวิธีที่ดีที่สุดในการสร้างซิงเกิลตันใน Objective-C (ปลอดภัยไหม) + (instancetype)sharedInstance { static dispatch_once_t once; static id sharedInstance; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }

4
GCD เพื่อทำงานในเธรดหลัก
ฉันมีการโทรกลับซึ่งอาจมาจากเธรดใด ๆ เมื่อฉันได้รับการติดต่อกลับนี้ฉันต้องการทำงานบางอย่างบนเธรดหลัก ฉันจำเป็นต้องตรวจสอบว่าฉันอยู่ในหัวข้อหลักแล้วหรือมีบทลงโทษใด ๆ หรือไม่โดยไม่ทำการตรวจสอบนี้ก่อนที่จะเรียกรหัสด้านล่าง dispatch_async(dispatch_get_main_queue(), ^{ // do work here });

6
ฉันจะ dispatch_sync, dispatch_async, dispatch_after และอื่น ๆ ใน Swift 3, Swift 4 และอื่น ๆ ได้อย่างไร
ฉันมีโค้ดจำนวนมากในโครงการ Swift 2.x (หรือ 1.x) ที่มีลักษณะดังนี้: // Move to a background thread to do some long running work dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image = self.loadOrGenerateAnImage() // Bounce back to the main thread to update the UI dispatch_async(dispatch_get_main_queue()) { self.imageView.image = image } } หรือสิ่งนี้เพื่อชะลอการดำเนินการ: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { …

9
ใน Swift วิธีการเรียกใช้เมธอดพร้อมพารามิเตอร์ในเธรดหลักของ GCD หรือไม่
ในแอพของฉันฉันมีฟังก์ชั่นที่ทำให้ NSRURLS เลือกและส่ง NSURLRequest โดยใช้ sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) ในบล็อกการทำให้เสร็จสมบูรณ์สำหรับงานนี้ฉันต้องทำการคำนวณบางอย่างที่เพิ่ม UIImage ไปยังตัวเรียก viewcontroller ฉันมีสิ่งที่เรียกว่า func func displayQRCode(receiveAddr, withAmountInBTC:amountBTC) นั่นคือการคำนวณการเพิ่ม UIImage ถ้าฉันพยายามเรียกใช้โค้ดเพิ่มการดูภายในบล็อกเสร็จสมบูรณ์ Xcode จะมีข้อผิดพลาดแจ้งว่าฉันไม่สามารถใช้เลย์เอาต์เอ็นจิ้นในขณะที่อยู่ในกระบวนการพื้นหลัง ดังนั้นฉันพบรหัสบางส่วนใน SO ที่พยายามจัดคิววิธีในเธรดหลัก: 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) }) อย่างไรก็ตามฉันไม่ทราบวิธีการเพิ่มพารามิเตอร์ "receiveAddr" …

10
รอจนกระทั่งมีการเรียกใช้บล็อก async สองบล็อกก่อนเริ่มบล็อกอื่น
เมื่อใช้ GCD เราต้องการรอจนกว่าจะมีการเรียกใช้และบล็อก async สองบล็อกก่อนที่จะดำเนินการขั้นตอนถัดไป วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร? เราลองทำสิ่งต่อไปนี้ แต่ดูเหมือนจะไม่ทำงาน: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the block1 and block2 are done before start block3 // how to do that? dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block3 });

13
ฉันจะรอให้บล็อกที่ส่งแบบอะซิงโครนัสเสร็จสิ้นได้อย่างไร
ฉันกำลังทดสอบโค้ดบางตัวที่ประมวลผลแบบอะซิงโครนัสโดยใช้ Grand Central Dispatch รหัสการทดสอบมีลักษณะดังนี้: [object runSomeLongOperationAndDo:^{ STAssert… }]; การทดสอบต้องรอให้การดำเนินการเสร็จสิ้น โซลูชันปัจจุบันของฉันมีลักษณะดังนี้: __block BOOL finished = NO; [object runSomeLongOperationAndDo:^{ STAssert… finished = YES; }]; while (!finished); อันไหนที่ดูค่อนข้างหยาบคุณรู้วิธีที่ดีกว่านี้ไหม? ฉันสามารถเปิดเผยคิวและบล็อกโดยโทรdispatch_sync: [object runSomeLongOperationAndDo:^{ STAssert… }]; dispatch_sync(object.queue, ^{}); ... objectแต่ที่อาจจะเปิดเผยมากเกินไปบน

8
รอจนกว่าการวนซ้ำอย่างรวดเร็วด้วยการร้องขอเครือข่ายแบบอะซิงโครนัสเสร็จสิ้นการดำเนินการ
ฉันต้องการสำหรับ in ในการส่งเครือข่ายจำนวนมากขอไปยังฐานข้อมูลแล้วส่งข้อมูลไปยังตัวควบคุมมุมมองใหม่เมื่อวิธีการเสร็จสิ้นการดำเนินการ นี่คือรหัสของฉัน: var datesArray = [String: AnyObject]() for key in locationsArray { let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in datesArray["\(key.0)"] = snapshot.value }) } // Segue to new view controller here and pass datesArray once it is complete ฉันมีข้อกังวลสองสามข้อ ก่อนอื่นฉันจะรอจนกว่าการวนซ้ำจะเสร็จสิ้นและคำขอเครือข่ายทั้งหมดเสร็จสมบูรณ์ได้อย่างไร ฉันไม่สามารถแก้ไขฟังก์ชัน observSingleEventOfType มันเป็นส่วนหนึ่งของ …

6
iPhone - Grand Central Dispatch หัวข้อหลัก
ฉันใช้กับความสำเร็จการจัดส่งส่วนกลางที่ยิ่งใหญ่ในแอพของฉัน แต่ฉันสงสัยว่าประโยชน์ที่แท้จริงของการใช้บางสิ่งเช่นนี้คืออะไร: dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff หรือแม้กระทั่ง dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff ฉันหมายถึงในทั้งสองกรณีคุณกำลังทำการบล็อกบล็อกที่จะถูกดำเนินการบนเธรดหลักตรงที่แอพทำงานและนี่จะไม่ช่วยลดภาระ ในกรณีแรกคุณไม่มีการควบคุมใด ๆ เมื่อบล็อกจะทำงาน ฉันได้เห็นกรณีของบล็อกถูกประหารชีวิตครึ่งวินาทีหลังจากที่คุณยิงพวกเขา กรณีที่สองมันคล้ายกับ [self doStuff]; ขวา? ฉันสงสัยว่าพวกคุณคิดอย่างไร

3
ความแตกต่างระหว่าง dispatch_async และ dispatch_sync บน Serial Queue?
ฉันได้สร้างอนุกรมคิวดังนี้: dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL); อะไรคือความแตกต่างระหว่างที่dispatch_asyncเรียกเช่นนี้ dispatch_async(_serialQueue, ^{ /* TASK 1 */ }); dispatch_async(_serialQueue, ^{ /* TASK 2 */ }); แล้วdispatch_syncเรียกแบบนี้บนซีเรียลคิว? dispatch_sync(_serialQueue, ^{ /* TASK 1 */ }); dispatch_sync(_serialQueue, ^{ /* TASK 2 */ }); ความเข้าใจของฉันคือไม่ว่าจะใช้วิธีการจัดส่งแบบใดTASK 1จะถูกดำเนินการและเสร็จสิ้นก่อนTASK 2ถูกต้องหรือไม่?

6
พร้อมกันกับคิวอนุกรมใน GCD
ฉันกำลังดิ้นรนเพื่อทำความเข้าใจอย่างถ่องแท้เกี่ยวกับคิวแบบต่อเนื่องและแบบอนุกรมใน GCD ฉันมีปัญหาบางอย่างและหวังว่าจะมีคนตอบฉันได้อย่างชัดเจนและตรงประเด็น ฉันกำลังอ่านว่ามีการสร้างและใช้คิวอนุกรมเพื่อดำเนินการทีละงาน อย่างไรก็ตามจะเกิดอะไรขึ้นหาก: ฉันสร้างคิวอนุกรม ฉันใช้dispatch_async(ในคิวอนุกรมที่ฉันเพิ่งสร้างขึ้น) สามครั้งเพื่อส่งสามบล็อก A, B, C สามบล็อกจะดำเนินการ: ตามลำดับ A, B, C เนื่องจากคิวเป็นแบบอนุกรม หรือ ในเวลาเดียวกัน (ในเวลาเดียวกันกับเธรดพาร์ราเลล) เนื่องจากฉันใช้การจัดส่ง ASYNC ฉันกำลังอ่านว่าฉันสามารถใช้dispatch_syncกับคิวพร้อมกันเพื่อดำเนินการบล็อกทีละรายการ ในกรณีนี้ทำไมจึงมีคิวแบบอนุกรมเนื่องจากฉันสามารถใช้คิวพร้อมกันได้ตลอดเวลาซึ่งฉันสามารถส่ง SYNCHRONOUSLY บล็อกได้มากเท่าที่ฉันต้องการ ขอบคุณสำหรับคำอธิบายที่ดี!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.