Tôi đang tạo một ứng dụng trò chuyện nhỏ. Trong ứng dụng của tôi, tôi đang sử dụng NSFetchedResultsController. Có 2 tableViews, 1 cho sảnh và 1 cho phòng chat. Vấn đề là bất cứ khi nào tôi bước vào một phòng chat, tôi phải đợi NSFetchedResultsController thực hiện tìm nạp và tải tất cả dữ liệu trước khi tôi có thể bắt đầu gõ bất cứ điều gì. Tôi đã tự hỏi nếu nó có thể phôi lấy trong nền hoặc bằng cách nào đó cho phép người dùng bắt đầu gõ trước khi các tin nhắn mới nhất được nạp.Thực hiện tìm nạp mà không bị đóng băng Giao diện người dùng
Vì vậy, nếu tôi đặt một phần trong phương pháp viewDidLoad, giao diện người dùng của tôi chỉ bị đóng băng cho đến khi tất cả các dữ liệu được nạp:
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
và nếu tôi đặt rằng đoạn mã vào một phương pháp riêng biệt và sau đó gọi phương pháp đó trong viewDidLoad trong nền
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
tableView chỉ là không cập nhật, vì vậy tôi phải quay trở lại để tableView đầu tiên và sau đó trở lại để có được bất kỳ kết quả.
Cảm ơn bạn.
Bất kỳ trợ giúp sẽ được đánh giá
cập nhật
tôi đã làm thử một vài cách khác để làm điều đó.
Cách 1:
-(void)reloadTheTable
{
[self.tableView reloadData];
}
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[self performSelectorOnMainThread:@selector(reloadTheTable) withObject:nil waitUntilDone:NO];
[pool release];
}
- (void)viewDidLoad {
//some code
[self performSelectorInBackground:@selector(fetchIt) withObject:nil];
//some other code
}
kết quả: tableView không hiển thị bất kỳ dữ liệu, cần phải mở lại mà điều khiển xem
Way 2:
- (void)viewDidLoad {
//some code
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
});
//some other code
}
kết quả: cập nhật tableView , nhưng giao diện người dùng bị đóng băng
Cách 3:
-(void)fetchIt
{
NSError *_error;
if (![self.fetchedResultsController performFetch:&_error]) {
NSLog(@"Unresolved error %@, %@", _error, [_error userInfo]);
}
}
- (void)viewDidLoad {
//some code
[self performSelectorOnMainThread:@selector(fetchIt) withObject:nil waitUntilDone:NO];
//some other code
}
kết quả: Giao diện người dùng bị đóng băng, cập nhật chế độ xem bảng.
Khi tôi đọc ở đâu đó, mọi thứ phải làm gì đó với giao diện người dùng phải được thực hiện trên một chuỗi chính. Nhưng tôi vẫn không thể tìm ra cách để làm điều đó mà không đóng băng tableView.
Cảm ơn bạn đã đọc.
Any help is appreciated
Tôi nghĩ bạn đang tìm [THIS] này (http://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html). – Kjuly
@Kjuly cảm ơn, nhưng nó vẫn là kinda không phản hồi. Sử dụng dispatch_async (dispatch_get_main_queue(),^{...}); – Novarg
Không sử dụng 'dispatch_get_main_queue' điều này sẽ chặn ứng dụng của bạn, hoặc khi giao diện người dùng chạy trong chuỗi chính, bạn cần tìm nạp dữ liệu trong các chuỗi khác. – Kjuly