Thread.sleep () ของ Java ที่เทียบเท่าใน Objective-C / Cocoa คืออะไร?


112

ใน Java Thread.sleep()คุณสามารถระงับการดำเนินการเธรดปัจจุบันสำหรับระยะเวลาในการใช้ มีสิ่งนี้ใน Objective-C หรือไม่?

คำตอบ:


160

ใช่มี+ [NSThread sleepForTimeInterval:]

(เพื่อให้คุณทราบสำหรับคำถามในอนาคต Objective-C คือภาษานั้นเองไลบรารีของวัตถุ (อย่างน้อยหนึ่งในนั้น) คือ Cocoa)


6
Thnx! <br> สำหรับการอ้างอิงในอนาคตความหมายคือ + [NSThread sleepForTimeInterval:] (ดังนั้นใช้เช่น [NSThread sleepForTimeInterval: 0.1])
TinkerTank

ลงตัวนี้ที่สุด ขอบคุณ! ฉันเพิ่งสร้างบล็อคแอนิเมชั่นของฉันเสร็จและมันก็ใช้งานได้อย่างมีเสน่ห์
RileyE

นอนบนเทอราปีเป็นยังไงบ้าง?
jerinho.com

1
มันเหมือนกัน; เธรดหลักเป็นเพียงเธรด การนอนบนเธรดหลักมักเป็นความคิดที่ไม่ดีเนื่องจากจะทำให้โปรแกรมของคุณไม่ตอบสนอง
smorgan

4
สำหรับผู้ที่สงสัยว่า [NSThread sleepForTimeInteval:] เหมือนกับ [[NSThread currentThread] sleepForTimeInterval:]
pnizzle

94

การนอนหนึ่งวินาทีใน Java:

Thread.sleep(1000);

การนอนเป็นเวลาหนึ่งวินาทีใน Objective C:

[NSThread sleepForTimeInterval:1.0f];

40

ทำไมคุณถึงนอนหลับ? เมื่อคุณเข้าสู่โหมดสลีปคุณกำลังบล็อก UI และการโหลด URL พื้นหลังที่ไม่ได้อยู่ในเธรดอื่น ๆ (โดยใช้วิธีการอะซิงโครนัส NSURL ยังคงทำงานบนเธรดปัจจุบัน)

โอกาสคือสิ่งที่คุณต้องการจริงๆคือ performSelector: withObject: AfterDelay นั่นเป็นวิธีการใน NSObject ที่คุณสามารถใช้เพื่อเรียกใช้เมธอดในช่วงเวลาที่กำหนดไว้ล่วงหน้าในภายหลังซึ่งจะกำหนดเวลาการโทรที่จะดำเนินการในภายหลัง แต่สิ่งอื่น ๆ ทั้งหมดที่จัดการเธรด (เช่น UI และการโหลดข้อมูล) จะ ยังคงดำเนินต่อไป


43
การนอนหลับมีประโยชน์สำหรับฉันสำหรับวัตถุประสงค์ในการทดสอบ ฉันสามารถจำลองความล่าช้าของเครือข่ายบางส่วนเพื่อให้แน่ใจว่าแอปของฉันตอบสนองอย่างถูกต้อง ขณะนี้ฉันกำลังทดสอบกับเว็บเซิร์ฟเวอร์ในพื้นที่ดังนั้นทุกอย่างจึงเกิดขึ้นทันที
brantonb

6
การนอนหลับเป็นวิธีทดสอบความล่าช้าของเครือข่ายที่ไม่ถูกต้อง ดูคำตอบสำหรับคำถามนี้stackoverflow.com/questions/1502060/…เพื่อดูวิธีทดสอบความเร็วตัวแปรของเครือข่ายในเครื่องจำลอง เนื่องจากการนอนหลับของเธรดหลักจะบล็อกทุกอย่างคุณจึงไม่ได้จำลองความล่าช้าของเครือข่ายเลย แต่เป็นการระงับแอปมากกว่า
Kendall Helmstetter Gelner

การนอนหลับมีประโยชน์ในการจำลองสิ่งที่ทำในการดำเนินการเข้าร่วมบนเธรด JAVA คุณนอนเป็นเวลา 10 มิลลิวินาทีตรวจสอบว่าเธรดตายหรือไม่จากนั้นคุณสามารถยกเลิกการจัดสรรได้
Mike S

1
หากคุณนอนในช่วงเวลาใดก็ตามด้ายของคุณจะอยู่ในสภาพเดียวกับก่อนที่คุณจะนอน ไม่ใช่การทดสอบที่ดีเพราะในโลกแห่งความเป็นจริงแอปพลิเคชันของคุณจะประมวลผลไม่ได้อยู่ในโหมดสลีป นั่นเป็นเหตุผลว่าทำไมจึงควรหาวิธีทดสอบโดยไม่พึ่งการนอนหลับ
Kendall Helmstetter Gelner

+1 ขอบคุณที่ชี้ทางเลือกอื่น! แค่สิ่งที่ฉันกำลังมองหา :)
jpswain

7

แน่นอนคุณสามารถใช้การโทร Unix sleep () และ usleep () มาตรฐานได้เช่นกัน (ถ้าเขียน Cocoa ฉันจะอยู่กับ [NSThread sleepForTimeInterval:])


5

หากคุณใช้ NSThread sleepForTimeInterval (รหัสที่แสดงความคิดเห็น) เพื่อเข้าสู่โหมดสลีปการดึงข้อมูลจะถูกบล็อก แต่ + [NSThread sleepForTimeInterval:] (วิธี checkLoad) จะไม่บล็อกการดึงข้อมูล

รหัสตัวอย่างของฉันดังต่อไปนี้:

- (void)viewDidAppear:(BOOL)animated
{
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
//    while (_loans == nil || _loans.count == 0)
//    {
//        [NSThread sleepForTimeInterval:1.0f];
//        [self reloadLoansFormApi];
//        NSLog(@"sleep ");
//    }
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
}

-(void) checkLoad
{
    [self reloadLoansFormApi];
    if (_loans == nil || _loans.count == 0)
    {
        [self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
    } else
    {
        NSLog(@"size %d", _loans.count);
        [self.tableView reloadData];
        //hide the loader view
        [HUD hideUIBlockingIndicator];
    }
}

0

usleep () สามารถใช้เป็น ive เพื่อหยุดเธรดปัจจุบันชั่วคราวได้ในบางครั้ง

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