Câu trả lời:
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.)
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];
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.
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:].)
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];
}
}