2013-08-16 46 views
20

Ứng dụng của tôi chạy tốt trong iOS6, nhưng trong phiên bản iOS sắp tới không xác định mà tôi không thể đặt tên vì lý do NDA, tất cả hoạt ảnh chuyển tiếp UIViewController ngừng hoạt động. Lượt xem mới chỉ xuất hiện ngay lập tức. Tôi không chắc chắn nếu phiên bản tương lai không xác định này của iOS là nguyên nhân, như tôi đã thấy điều này xảy ra đôi khi trong iOS6.Hoạt ảnh UIViewController ngừng hoạt động

Đôi khi hoạt ảnh bắt đầu hoạt động trong một thời gian và sau đó dừng lại ngay sau đó, khiến tôi nghĩ đó là một số vấn đề cảnh báo bộ nhớ, nhưng ứng dụng của tôi đang sử dụng khá nhiều RAM 125MB một cách hợp lý. Bất cứ ai có thể cung cấp bất kỳ lời khuyên hoặc điều cần điều tra?

+0

Thông tin thêm sẽ là hữu ích ở đây. Bạn đang làm gì và làm thế nào? Bạn có thể đăng một số mã có liên quan không?Nếu không, bạn có thể có nhiều may mắn hơn trên diễn đàn Apple Dev. –

+0

Tôi đang làm hoàn toàn bình thường [self.navigationController pushViewController: viewController hoạt hình: YES] - kiểu xem chuyển tiếp bộ điều khiển. Đáng buồn thay, các diễn đàn dev của apple là một chút đất hoang so với SO trong kinh nghiệm của tôi, nhưng tôi cũng có một chủ đề mở ở đó. –

+0

Bạn không sử dụng các lớp con tùy chỉnh của UIViewControllers? Chỉ cần phần chứng khoán? Tôi chưa bao giờ nghe nói về hình ảnh động dừng lại vì áp lực bộ nhớ; điều đó dường như không xảy ra. – Jeff

Trả lời

39

Hành vi được mô tả luôn tồn tại: nếu bạn làm việc trên các chủ đề nền và sau đó gọi và các phương thức UIKit thì thường xuyên hơn là bản cập nhật sẽ bị trì hoãn theo cách kỳ lạ.

Do đó, bạn nên luôn luôn dispatch_async vào hàng đợi chính để cập nhật giao diện người dùng.

Các lỗi này rất khó nắm bắt vì chúng không phải lúc nào cũng xảy ra theo dự đoán.

Để bắt chúng, tôi đã xây dựng một phương thức làm rối loạn một số phương thức UIKit để kiểm tra xem chúng có được gọi trên luồng chính hay không. Điều này cho phép bạn dừng lại trên một breakpoint tượng trưng, ​​bất cứ khi nào bạn đã quên gửi trở lại hàng đợi chính.

https://github.com/Cocoanetics/DTFoundation/blob/develop/Core/Source/iOS/Debug/UIView%2BDTDebug.m

+0

Mã đó chính xác là cách tôi tìm thấy nội dung chuỗi nền. –

+0

Từ nguồn của iHunter, bạn cần DTObjectBlockExecutor, NSObject + DTRuntime, và UIView + DTDebug, để làm rối loạn phương thức xem và nắm bắt các vấn đề. –

+0

Wow !! cảm ơn rất nhiều!! tuyệt vời!!! Cocoanetics bạn đá !! – user1010819

14

Một cách giải quyết tốt từ các diễn đàn dev của Apple về vấn đề này:

Làm điều này:

[UIView setAnimationsEnabled:YES] 

Và hình ảnh động bắt đầu làm việc trở lại. Tôi nghi ngờ rằng đây là lỗi iOS7 thẳng đứng hoặc một nơi nào đó trong mã của tôi hoạt ảnh hoặc khởi chạy UIViewController đang diễn ra trên một chuỗi nền, khiến hoạt ảnh ngừng hoạt động. Có lẽ không liên quan đến phiên bản iOS không xác định trong tương lai.

+0

Fyi, trên ứng dụng xem hoạt hình của chúng tôi dường như hoạt động ok, fyi. Ngoài ra, thêm một câu hỏi. Nghĩ rằng đó là một câu hỏi ok. – ort11

+1

lý do bạn đăng câu trả lời? có quá HAI câu trả lời? hãy đặt câu hỏi này vào câu hỏi sau khi chỉnh sửa ... –

0

Sự cố này dường như được gây ra do thực hiện công việc UIKit trong chủ đề nền. Tôi có một bộ nhớ cache trước khi render đầy đủ của NSOperations mà làm phức tạp UIViews để UIImages để cache đầu ra. Điều này dường như làm việc tốt trong iOS6, nhưng có lẽ không vượt qua dòng hơi. Tôi sẽ cần phải thay thế chức năng này với một cái gì đó mà làm cho hình ảnh và văn bản vào một bộ đệm đồ họa hơn là sử dụng UIViews và UILabels ở tất cả.

0

Tất cả bạn phải làm là bắt giữ hàng đợi chính khi cập nhật giao diện người dùng trên nhận phản hồi từ một API.Ios sử dụng hàng đợi chính theo mặc định cho việc cập nhật giao diện người dùng nhưng nó không phải là 100 phần trăm efficient.Hence bạn có để đảm bảo rằng giao diện người dùng được cập nhật trên chỉ thread chính và cách để làm điều đó như sau:

DispatchQueue.main.async{ 
    //UI related code eg: 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
} 

Nếu bạn không bắt giữ hình ảnh động chủ đề chính có thể hoặc không thể làm việc. Nhưng nếu bạn đang sử dụng hình động chủ đề chính chắc chắn sẽ hoạt động.

Mã đúng khi cập nhật giao diện người dùng trên phản ứng api:

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    DispatchQueue.main.async{ 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
    } 
}) 

Mã không đúng có thể gây hình ảnh động để dừng lại và dẫn đến tai nạn kỳ lạ:

Alamofire.getApiCall(paramaters: parameters, completion:{ 
    response in 
    // UI related code. 
    self.label.text = "abc" 
    self.button.setTitle("xyz",.normal) 
    self.tableView.reloadData() 
}) 
Các vấn đề liên quan