Thread.sleep () của Java trong Objective-C / Cocoa là gì?


112

Trong Java, bạn có thể tạm ngừng thực thi luồng hiện tại trong một khoảng thời gian bằng cách sử dụng Thread.sleep(). Có cái gì như thế này trong Objective-C không?

Câu trả lời:


160

Có, có + [NSThread sleepForTimeInterval:]

(Xin lưu ý rằng đối với các câu hỏi trong tương lai, Objective-C chính là ngôn ngữ; thư viện các đối tượng (ít nhất là một trong số chúng) là Cocoa.)


6
Thnx! <br> để tham khảo trong tương lai, định nghĩa thực sự là + [NSThread sleepForTimeInterval:] (vì vậy, được sử dụng như [NSThread sleepForTimeInterval: 0,1]).
TinkerTank

Đây là hoàn hảo. Cảm ơn! Tôi vừa hoàn thành các khối hoạt hình của mình và nó hoạt động như một sự quyến rũ.
RileyE

làm thế nào về việc ngủ trên therad chính?
jerinho.com 12/12/12

1
Nó giống nhau; luồng chính chỉ là một luồng. Mặc dù vậy, ngủ trên luồng chính thường là một ý tưởng tồi, vì nó khiến chương trình của bạn không phản hồi.
smorgan 17/12/12

4
đối với những người thắc mắc, [NSThread sleepForTimeInteval:] giống với [[NSThread currentThread] sleepForTimeInterval:].
pnizzle,

94

Ngủ một giây trong Java:

Thread.sleep(1000);

Ngủ một giây trong Mục tiêu C:

[NSThread sleepForTimeInterval:1.0f];

40

Tại sao bạn đang ngủ? Khi bạn ngủ, bạn đang chặn giao diện người dùng và bất kỳ tải URL nền nào không nằm trong các luồng khác (sử dụng các phương thức không đồng bộ NSURL vẫn hoạt động trên luồng hiện tại).

Rất có thể những gì bạn thực sự muốn là performanceSelector: withObject: AfterDelay. Đó là một phương thức trên NSObject mà bạn có thể sử dụng để gọi một phương thức vào một khoảng thời gian xác định trước nào đó sau này - nó lên lịch cho một cuộc gọi sẽ được thực hiện sau đó, nhưng tất cả những thứ khác mà luồng xử lý (như giao diện người dùng và tải dữ liệu) sẽ vẫn tiếp tục.


43
Ngủ rất hữu ích đối với tôi cho mục đích thử nghiệm. Tôi có thể mô phỏng một số sự chậm trễ của mạng để đảm bảo rằng ứng dụng của tôi phản hồi đúng cách. Hiện tại, tôi đang thử nghiệm trên một máy chủ web cục bộ, vì vậy mọi thứ về cơ bản là tức thời.
brantonb

6
Ngủ là cách sai để kiểm tra độ trễ của mạng. Xem câu trả lời cho câu hỏi này stackoverflow.com/questions/1502060/… để xem cách kiểm tra tốc độ thay đổi của mạng trong trình mô phỏng. Bởi vì quá trình ngủ mà luồng chính chặn mọi thứ, bạn không mô phỏng sự chậm trễ của mạng mà chính là việc tạm ngưng ứng dụng.
Kendall Helmstetter Gelner

Ngủ rất hữu ích để mô phỏng những gì được thực hiện trên một hoạt động nối trên một chuỗi JAVA. Bạn ngủ trong 10 mili, hãy kiểm tra xem luồng đã chết chưa thì bạn có thể xử lý nó.
Mike S

1
Nếu bạn ngủ trong bất kỳ khoảng thời gian nào, chuỗi của bạn sẽ ở trạng thái chính xác như trước khi bạn ngủ. Đây không phải là một thử nghiệm tốt vì trong thế giới thực, ứng dụng của bạn sẽ được xử lý chứ không phải ở chế độ ngủ. Đó là lý do tại sao điều quan trọng là phải tìm ra cách kiểm tra mà không dựa vào giấc ngủ.
Kendall Helmstetter Gelner,

+1 Cảm ơn bạn đã chỉ ra một giải pháp thay thế! Chỉ là những gì tôi đang tìm kiếm :)
jpswain

7

Tất nhiên, bạn cũng có thể sử dụng lệnh gọi Unix sleep () và usleep () tiêu chuẩn. (Tuy nhiên, nếu viết Cocoa, tôi sẽ ở lại với [NSThread sleepForTimeInterval:].)


5

Nếu bạn sử dụng NSThread sleepForTimeInterval (mã đã nhận xét) ở chế độ ngủ, việc tìm nạp dữ liệu sẽ bị chặn, nhưng + [NSThread sleepForTimeInterval:] (phương thức checkLoad) sẽ không chặn tìm nạp dữ liệu.

Mã ví dụ của tôi như sau:

- (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 () cũng có thể được sử dụng vì đôi khi tôi đã sử dụng nó để tạm dừng chuỗi hiện tại

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.