2015-12-16 16 views
13

Tôi biết giao diện người dùng cập nhật khi ứng dụng ở chế độ nền không được Apple khuyến nghị, đặc biệt là đối với OpenGL.Cách chuẩn bị cập nhật giao diện người dùng trước khi ứng dụng nhập vào mặt đất

Tuy nhiên tôi vừa nhận ra iMessenger và tin nhắn của Facebook trông giống như có thể làm điều đó. Nhập một chuỗi tin nhắn với bạn bè của bạn và sau đó đi nền, sau đó nhận được một tin nhắn mới trong khi ứng dụng vẫn ở chế độ nền, sau đó đưa ứng dụng này lên nền trước (nhấp vào biểu tượng thông báo hoặc biểu tượng ứng dụng), bạn sẽ thấy bong bóng tin nhắn mới đã ở đó với hoạt ảnh mở rộng ứng dụng từ biểu tượng.

Đối với sự hiểu biết của tôi, điều này chỉ có thể xảy ra vì bong bóng tin nhắn mới đã được vẽ ở chế độ nền. Sau đó, trong khi ứng dụng nhập vào nền trước, nó có thể xuất hiện trong hoạt ảnh.

Tuy nhiên, từ kết quả thử nghiệm của tôi, trong iOS8 và iOS9, tất cả cập nhật giao diện người dùng nền sẽ bị hoãn sau khi ứng dụng đã hoạt động. Và hơn nữa, iOS sẽ thêm một giao dịch hoạt hình ngầm cho bản cập nhật giao diện người dùng đó.

Tôi liệt kê mã thử nghiệm của mình như dưới đây, bạn sẽ thấy ô mới được thêm vào bảng với giao dịch hoạt ảnh rõ ràng khi ứng dụng chạy nền trước, hoàn toàn không giống với iMessenger. TableView: numberOfRowsInSection: sẽ chỉ được thực hiện chậm trễ khi ứng dụng nhập vào nền trước.

Và không chỉ cho cập nhật ô xem bảng, thậm chí thêm một bản xem trước trong nền cũng sẽ kích hoạt giao dịch bị trì hoãn tương tự để nhập tiền nền.

Có thể tôi đang hoàn toàn sai về hướng này. Bất cứ ai có thể giúp tôi hiểu làm thế nào iMessenger và tin nhắn của FB có thể đạt được hiệu ứng này? Cảm ơn bạn trước!

@interface ViewController() <UITableViewDataSource, UITableViewDelegate> 

@property (nonatomic) UITableView *tableView; 
@property (nonatomic) NSMutableArray *dataTable; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:self.tableView]; 
    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 
    [self.tableView registerClass:[UITableViewCell class] 
     forCellReuseIdentifier:@"kCellId"]; 

    self.dataTable = [[NSMutableArray alloc] initWithArray:@[@"1", @"2", @"3"]]; 

    __weak __typeof(self) weakSelf = self; 
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification 
                object:nil 
                queue:[NSOperationQueue mainQueue] 
               usingBlock:^(NSNotification * _Nonnull note) { 
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), 
                   dispatch_get_main_queue(), ^{ 
                [weakSelf.dataTable addObject:[@(weakSelf.dataTable.count + 1) stringValue]]; 
                [weakSelf.tableView reloadData]; 
                }); 
               }]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.dataTable.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kCellId"]; 
    cell.textLabel.text = self.dataTable[indexPath.row]; 
    return cell; 
} 

@end 
+0

Tại sao các bạn sử dụng 'dispatch_after'? Điều này buộc phải chờ một vòng lặp chạy và thực thi khối sau - sau khi màn hình đã được vẽ một lần. NSNotificationCenter thực sự * luôn * gọi các quan sát viên của nó trong chuỗi chính. Điều này có nghĩa là bạn không phải sử dụng GCD chút nào. Hãy thử xóa cuộc gọi 'dispatch_after'. – Farthen

+0

sử dụng dispatch_after là cố gắng mô phỏng cập nhật giao diện người dùng khi ứng dụng ở chế độ nền. Trực tiếp gọi cập nhật giao diện người dùng sau khi đã nhập thông báo nền không thể đảm bảo hoạt ảnh lõi đã dừng lại. – Pei

+0

Tôi khuyên bạn không nên hardcode một trường hợp thử nghiệm như thế này. Nếu bạn muốn thử nghiệm tốt hơn, tôi sẽ gửi thông báo đẩy tới ứng dụng của bạn, với một số dữ liệu tùy ý. Khi ứng dụng nhận được thông báo đẩy, hãy cập nhật dataTable với dữ liệu nhận được từ thông báo đẩy. –

Trả lời

1

tôi có thể khuyên bạn nên nhìn vào APN payload documentation cho ra mắt-mage.

khởi chạy hình ảnh - Tên tệp của tệp hình ảnh trong gói ứng dụng; nó có thể bao gồm phần mở rộng hoặc bỏ qua nó. Hình ảnh được sử dụng làm hình ảnh khởi chạy khi người dùng nhấn vào nút tác vụ hoặc di chuyển thanh trượt hành động. Nếu thuộc tính này không được chỉ định, hệ thống sẽ sử dụng ảnh chụp nhanh trước đó, sử dụng hình ảnh được xác định bằng khóa UILaunchImageFile trong tệp Info.plist của ứng dụng hoặc quay trở lại Default.png. Thuộc tính này đã được thêm vào iOS 4.0.

1

nền Fetch cho phép hệ thống để đánh thức các ứng dụng lên trong nền

chi tiết hơn enter link description here

+0

Cảm ơn bạn đã trả lời, tuy nhiên ngay cả ứng dụng tỉnh dậy ở chế độ nền, tất cả cập nhật giao diện người dùng sẽ được đăng lên một lần cho đến khi hoạt động trở lại. Cho thuê phiên bản iOS sau 8.0 – Pei

Các vấn đề liên quan