คำถามติดแท็ก objective-c-blocks

การบล็อกเป็นการใช้งานการปิดสำหรับ C ของ Apple ซึ่งมีให้สำหรับ Objective-C และ C ++ ด้วย

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

8
คำหลัก“ __block” หมายถึงอะไร
สิ่งที่ว่าไม่__blockคำหลักใน Objective-C หมายถึง? ฉันรู้ว่ามันช่วยให้คุณสามารถปรับเปลี่ยนตัวแปรภายในบล็อกได้ แต่ฉันอยากรู้ว่า ... มันบอกอะไรกับคอมไพเลอร์? มันทำอะไรอย่างอื่นได้ไหม? หากเป็นเช่นนั้นแล้วทำไมจึงเป็นสิ่งจำเป็นในตอนแรก มันอยู่ในเอกสารทุกที่หรือไม่? (หาไม่เจอ)

8
กำหนดตัวแปรภายในบล็อกให้กับตัวแปรภายนอกบล็อก
ฉันได้รับข้อผิดพลาด ตัวแปรไม่สามารถกำหนดได้ (ตัวระบุประเภท __block หายไป) aPerson = participant;บนเส้น ฉันจะแน่ใจได้อย่างไรว่าบล็อกสามารถเข้าถึงaPersonตัวแปรและaPersonสามารถส่งคืนตัวแปรได้ Person *aPerson = nil; [participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Person *participant = (Person*)obj; if ([participant.gender isEqualToString:@"M"]) { aPerson = participant; *stop = YES; } }]; return aPerson;


7
รายการบล็อกการประกาศบล็อก
ไวยากรณ์ที่ถูกบล็อกใน Objective C (และแน่นอน C, ฉันเข้าใจ) ไม่เข้ากันอย่างฉาวโฉ่ การส่งบล็อกเป็นอาร์กิวเมนต์จะต่างไปจากการประกาศบล็อกเป็นไอวอรี่ซึ่งมีลักษณะแตกต่างจากtypedefบล็อกไอเอ็นจี มีรายการที่ครอบคลุมของไวยากรณ์ประกาศบล็อกที่ฉันสามารถเก็บไว้เพื่อการอ้างอิงอย่างรวดเร็ว?

8
ฉันจะหลีกเลี่ยงการจับภาพตนเองเป็นบล็อกเมื่อใช้งาน API ได้อย่างไร
ฉันมีแอพที่ใช้งานได้และกำลังแปลงเป็น ARC ใน Xcode 4.2 หนึ่งในคำเตือนก่อนการตรวจสอบที่เกี่ยวข้องกับการจับselfอย่างยิ่งในบล็อกที่นำไปสู่วงจรการเก็บรักษา ฉันได้สร้างตัวอย่างโค้ดง่ายๆเพื่ออธิบายปัญหา ฉันเชื่อว่าฉันเข้าใจความหมายของสิ่งนี้ แต่ฉันไม่แน่ใจว่า "ถูกต้อง" หรือวิธีที่แนะนำให้ใช้สถานการณ์ประเภทนี้ self เป็นตัวอย่างของคลาส MyAPI รหัสด้านล่างนั้นง่ายขึ้นเพื่อแสดงเฉพาะการโต้ตอบกับวัตถุและบล็อกที่เกี่ยวข้องกับคำถามของฉัน สมมติว่า MyAPI รับข้อมูลจากแหล่งข้อมูลระยะไกลและ MyDataProcessor ทำงานกับข้อมูลนั้นและสร้างเอาต์พุต โปรเซสเซอร์ได้รับการกำหนดค่าด้วยบล็อกเพื่อสื่อสารความคืบหน้าและสถานะ ตัวอย่างโค้ด: // code sample self.delegate = aDelegate; self.dataProcessor = [[MyDataProcessor alloc] init]; self.dataProcessor.progress = ^(CGFloat percentComplete) { [self.delegate myAPI:self isProcessingWithProgress:percentComplete]; }; self.dataProcessor.completion = ^{ [self.delegate myAPIDidFinish:self]; self.dataProcessor = nil; …

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 });

9
รักษาวงจรใน "ตัวเอง" กับบล็อก
ฉันเกรงว่าคำถามนี้ค่อนข้างง่าย แต่ฉันคิดว่ามันเกี่ยวข้องกับโปรแกรมเมอร์ Objective-C จำนวนมากที่เข้าบล็อก สิ่งที่ฉันได้ยินคือตั้งแต่บล็อกจับตัวแปรภายในที่อ้างอิงภายในพวกเขาเป็นconstสำเนาการใช้selfภายในบล็อกอาจส่งผลให้เกิดการวนรอบในกรณีที่ควรคัดลอกบล็อกนั้น ดังนั้นเราควรจะใช้__blockเพื่อบังคับให้บล็อกจัดการโดยตรงselfแทนที่จะคัดลอกบล็อก __block typeof(self) bself = self; [someObject messageWithBlock:^{ [bself doSomething]; }]; แทนที่จะเป็นเพียงแค่ [someObject messageWithBlock:^{ [self doSomething]; }]; สิ่งที่ฉันอยากรู้มีดังต่อไปนี้ถ้าเป็นจริงมีวิธีที่ฉันสามารถหลีกเลี่ยงความอัปลักษณ์ (นอกเหนือจากการใช้ GC) หรือไม่

6
ควรใช้ enumerateObjectsUsingBlock กับเมื่อใด
นอกจากความแตกต่างที่ชัดเจน: ใช้enumerateObjectsUsingBlockเมื่อคุณต้องการทั้งดัชนีและวัตถุ อย่าใช้enumerateObjectsUsingBlockเมื่อคุณต้องการแก้ไขตัวแปรท้องถิ่น (ฉันผิดเกี่ยวกับเรื่องนี้ดูคำตอบของ bbum) มีการenumerateObjectsUsingBlockพิจารณาโดยทั่วไปดีขึ้นหรือแย่ลงเมื่อfor (id obj in myArray)ยังจะทำงานหรือไม่ อะไรคือข้อดี / ข้อเสีย (เช่นมันเป็นนักแสดงมากหรือน้อย)?

5
ประกาศพารามิเตอร์เมธอดบล็อกโดยไม่ใช้ typedef
เป็นไปได้ที่จะระบุพารามิเตอร์ method block ใน Objective-C โดยไม่ต้องใช้ typedef หรือไม่? จะต้องเป็นเช่นตัวชี้ฟังก์ชั่น แต่ฉันไม่สามารถเข้าถึงไวยากรณ์ที่ชนะโดยไม่ต้องใช้ตัวพิมพ์กลาง: typedef BOOL (^PredicateBlock_t)(int); - (void) myMethodTakingPredicate:(PredicateBlock_t)predicate เฉพาะการคอมไพล์ด้านบนสิ่งเหล่านี้ล้มเหลว: - (void) myMethodTakingPredicate:( BOOL(^block)(int) ) predicate - (void) myMethodTakingPredicate:BOOL (^predicate)(int) และฉันจำไม่ได้ว่าชุดค่าผสมอื่น ๆ ที่ฉันได้ลองไว้


7
เก็บการปิดเป็นตัวแปรใน Swift
ใน Objective-C คุณสามารถกำหนดอินพุตและเอาต์พุตของบล็อกเก็บหนึ่งในบล็อกเหล่านั้นที่ส่งผ่านไปยังเมธอดจากนั้นใช้บล็อกนั้นในภายหลัง: // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler …

7
ทางเลือกในการ dispatch_get_current_queue () สำหรับการบล็อกให้เสร็จสมบูรณ์ใน iOS 6?
ฉันมีวิธีการที่ยอมรับบล็อกและบล็อกเสร็จสิ้น บล็อกแรกควรทำงานในพื้นหลังในขณะที่บล็อกการเสร็จสมบูรณ์ควรทำงานในคิวใดก็ตามที่เมธอดเรียก ในช่วงหลังฉันใช้มาตลอดdispatch_get_current_queue()แต่ดูเหมือนว่าจะเลิกใช้งานใน iOS 6 ขึ้นไป ฉันควรใช้อะไรแทน?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.