2012-12-14 31 views
5


Tôi đang làm một số xử lý khi ứng dụng vào trạng thái nền, tôi đã đặt nó dưới beginBackgroundTaskWithExpirationHandler() và do đó, nên được phân bổ mười phút cho cùng. Tuy nhiên, tôi tin rằng ứng dụng đang bị tạm ngưng trước đó. Tác vụ tôi đang thực hiện là bộ nhớ và CPU chuyên sâu, vì vậy có thể hệ điều hành đang đặt ứng dụng của tôi để tạm ngưng trạng thái không?
Nếu có, có cách nào vượt qua những hạn chế này không. (Tôi đang mở để sử dụng API riêng).Chạy một tác vụ chạy nền hữu hạn dài

Đây là đoạn mã để bắt đầu nhiệm vụ nền:

if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){ 

     if([[UIDevice currentDevice] isMultitaskingSupported]){ 
      __block UIBackgroundTaskIdentifier bgTask; 
      UIApplication *application = [UIApplication sharedApplication]; 
      bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
      }]; 

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       [self captureImage]; 
       [application endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      }); 
     } 
    } 
+0

Bạn có thể hiển thị mã bạn sử dụng để bắt đầu tác vụ nền không? – Nate

+2

Làm thế nào địa ngục này * không phải là một câu hỏi thực *? – Nate

Trả lời

2

Tôi không chắc chắn rằng Daij-Dan là hoàn toàn đúng.

phần này tôi đồng ý với ông:

the os may kill you at any time when its pressured. 

Tuy nhiên từ "áp lực" là khá mơ hồ. Và tôi tin rằng cần phải có rất nhiều áp lực (ví dụ như bộ nhớ thấp) để đình chỉ ứng dụng yêu cầu hợp pháp nhiều thời gian hơn. Một mặt, đó là một trường hợp kịch bản thực sự. Mặt khác, nó xảy ra không thường xuyên (các thiết bị iOS có khá nhiều bộ nhớ ngày nay).

Từ tài liệu (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html):

Mỗi cuộc gọi đến phương pháp này phải được cân bằng một cuộc gọi phù hợp với phương thức endBackgroundTask: . Các ứng dụng chạy các tác vụ nền có một lượng thời gian hữu hạn để chạy chúng. (Bạn có thể tìm hiểu xem còn bao nhiêu thời gian bằng cách sử dụng thuộc tính backgroundTimeRemaining) Nếu bạn không gọi endBackgroundTask: cho mỗi tác vụ trước khi hết hạn, hệ thống sẽ giết ứng dụng. Nếu bạn cung cấp một đối tượng khối trong tham số trình xử lý, hệ thống sẽ gọi trình xử lý của bạn trước khi thời gian hết hạn để cho bạn cơ hội kết thúc nhiệm vụ.

Tôi muốn giới thiệu:

  • Thêm một số bản ghi trong xử lý hoàn
  • Thêm bản ghi vào nhật ký với logic (bao gồm backgroundTimeremaining)

Và nếu ứng dụng của bạn đã bị đình chỉ hệ thống xem xét giao diện điều khiển các bản ghi .

P.S. Tôi đã xóa thẻ iphone-privateapi vì đó là API công khai.

+0

Cảm ơn. Tôi đã sử dụng thuộc tính backgroundTimeRemaining và theo dõi thời gian còn lại chỉ để tìm sự giảm đột ngột xuống 0. –

+0

Điều đó thật thú vị. Bạn có thấy bất cứ điều gì đáng ngờ xung quanh điều này trong giao diện điều khiển hệ thống (tôi chưa bao giờ thấy trường hợp như thế này). –

1

os có thể giết bạn bất cứ lúc nào khi bị áp lực của nó. không có bảo đảm nào về mười phút. (bạn cũng có thể chạy lâu hơn nữa nếu bạn cư xử: D)

không có cách nào để buộc ios để chạy ứng dụng của bạn AFAIK

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