2011-10-31 34 views
9

Ứng dụng của tôi tải video lên Facebook. Tôi muốn hoàn tất quá trình tải lên trong nền, ngay cả khi người dùng thiếu kiên nhẫn nhấp vào nút Trang chủ trong khi tải lên.iOS - Cách hoàn tất quá trình dài trong nền

Sau khi một số đọc, tôi đã cố gắng này:

 UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
    }]; 

    [fb requestWithGraphPath:@"me/videos" 
        andParams:params 
       andHttpMethod:@"POST" 
        andDelegate:self]; 

    [[UIApplication sharedApplication] endBackgroundTask:bti]; 

Công việc được thực hiện với phương thức yêu cầu fb. Video được tải lên Facebook qua kết nối http. Điều này hoạt động tốt, nhưng nếu bạn nền ứng dụng bằng cách nhấp vào nút Trang chủ trong khi quá trình tải lên đang diễn ra, quá trình tải lên bị tạm ngưng. Nếu bạn đặt trước ứng dụng, quá trình tải lên sẽ tiếp tục.

Điều tôi đã hy vọng sẽ xảy ra là quá trình tải lên sẽ kết thúc ở chế độ nền.

Bất kỳ hy vọng nhận được điều đó để hoạt động? Tôi có làm gì sai với toàn bộ điều startBackgroundTask không? Nó có vẻ quá đơn giản để làm việc theo cách đó, nhưng đó là những gì các tài liệu dường như nói.

Bất kỳ trợ giúp nào, được đánh giá cao.

- John

+0

@jhon tôi cần tải lên video ở chế độ nền. tôi có thể làm điều đó suing khối mã này ?? là có bất kỳ cơ hội mà táo có thể từ chối ứng dụng của tôi kể từ khi thực hiện quá trình chạy dài trong nền có những hạn chế –

Trả lời

9

Bạn cần gọi [[UIApplication sharedApplication] endBackgroundTask:bti]; trong cuộc gọi đại biểu. Bạn sẽ cần phải lưu trữ bti trong một thanh ngang hoặc dưới dạng biến tĩnh.

+0

Cảm ơn đã cho tôi đi đúng hướng. Tôi đã cung cấp một câu trả lời chi tiết hơn, cho những người có thể gặp rắc rối với điều này. – John

15

OK, tôi đã tìm ra. Bạn cần phải thực thi mã 'bắt đầu' ở đầu nhiệm vụ dài mà bạn muốn hoàn thành trong nền, ngay cả sau khi thoát ứng dụng, và sau đó thực thi mã 'kết thúc' khi tác vụ hoàn tất.

Mã của tôi ở trên thực hiện mã 'kết thúc' quá sớm, do đó kết thúc thực hiện nền gần như ngay lập tức.

Cách để làm điều đó là để làm một cái gì đó như:

// make sure save can complete in the background 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) 
     backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]; 

khi nhiệm vụ dài bắt đầu. Như hypercrypt, ở trên, nói, 'backgroundTaskID phải là một ivar hoặc một cái gì đó bạn có thể nhận được sau này, khi nhiệm vụ dài hoàn thành.

Khi nhiệm vụ hoàn thành, thực hiện một cái gì đó như:

if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID]; 
    backgroundTaskID = UIBackgroundTaskInvalid; 
} 

Nó hoạt động như một nét duyên dáng.

+2

John - Bạn có bóc sợi chỉ và đặt tất cả điều này vào luồng không, hay bạn đợi tín hiệu từ chuỗi mới và sau đó gọi kết thúcBackBackTask trên luồng chính? – Chris

+1

@Chris Tôi nghĩ rằng đó là một ý tưởng hay để đưa quy trình lên một chủ đề mới. Nếu bạn phải làm điều đó trong nền, có thể là một nhiệm vụ dài và phức tạp nên được thực hiện trên một chuỗi khác để tránh làm tắc nghẽn giao diện người dùng. –

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