Chương trình của tôi hiển thị bề mặt cuộn ngang được lát bằng UIImageViews từ trái sang phải. Mã chạy trên chuỗi giao diện người dùng để đảm bảo rằng UIImageViews mới hiển thị có UIImage mới được gán cho chúng. Quá trình tải xảy ra trên một chuỗi nền.Tải xuống CGImage/UIImage tải lên trên UI gây ra tình trạng lộn xộn
Mọi thứ hoạt động gần như tốt, ngoại trừ có một đoạn nói lắp khi mỗi hình ảnh hiển thị. Lúc đầu, tôi nghĩ công nhân nền của tôi đã khóa một thứ gì đó trong chuỗi giao diện người dùng. Tôi đã dành rất nhiều thời gian nhìn vào nó và cuối cùng nhận ra rằng UIImage đang làm một số xử lý thêm lười biếng trên thread UI khi nó lần đầu tiên trở nên nhìn thấy được. Điều này giải đố tôi, vì chuỗi công nhân của tôi có mã rõ ràng để giải nén dữ liệu JPEG.
Dù sao, trên linh cảm, tôi đã viết một số mã để hiển thị thành ngữ cảnh đồ họa tạm thời trên chuỗi nền và - chắc chắn đủ, sự nói lắp đã biến mất. UIImage hiện đang được tải sẵn trên chuỗi công nhân của tôi. Càng xa càng tốt.
Vấn đề là phương pháp "tải trọng lười biếng của hình ảnh" của tôi không đáng tin cậy. Nó gây ra EXC_BAD_ACCESS liên tục. Tôi không biết UIImage thực sự đang làm gì đằng sau hậu trường. Có lẽ nó đang giải nén dữ liệu JPEG. Dù sao, phương pháp là:
+ (void)forceLazyLoadOfImage: (UIImage*)image
{
CGImageRef imgRef = image.CGImage;
CGFloat currentWidth = CGImageGetWidth(imgRef);
CGFloat currentHeight = CGImageGetHeight(imgRef);
CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat scaleRatioX = bounds.size.width/currentWidth;
CGFloat scaleRatioY = bounds.size.height/currentHeight;
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, scaleRatioX, -scaleRatioY);
CGContextTranslateCTM(context, 0, -currentHeight);
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, CGRectMake(0, 0, currentWidth, currentHeight), imgRef);
UIGraphicsEndImageContext();
}
Và EXC_BAD_ACCESS xảy ra trên dòng CGContextDrawImage. CÂU HỎI 1: Tôi có được phép làm điều này trên một chủ đề khác với chuỗi giao diện người dùng không? CÂU HỎI 2: UIImage thực sự "tải trước" là gì? CÂU HỎI 3: Cách chính thức để giải quyết vấn đề này là gì?
Cảm ơn bạn đã đọc tất cả điều đó, mọi lời khuyên sẽ được đánh giá cao!
xin chào, cảm ơn vì đã dành thời gian trợ giúp việc này. Cuối cùng tôi đã nhận ra điều này. Tôi chỉ có thể tưởng tượng loại bộ nhớ đệm không an toàn không an toàn nào đang xảy ra bên trong các phương thức UI * đó. Giao diện của tôi bây giờ là nói lắp miễn phí ..... – JBx
Tôi đang bối rối ... bạn đang nói imageNamed: gây ra tập tin lười biếng IO nhưng .. tạo một đối tượng dữ liệu sẽ không? Hay bạn đang nói rằng bạn nên có các đối tượng dữ liệu gộp vào một nơi nào đó để được rút ra khi thích hợp? –
Jasconius: Nếu bạn tạo một đối tượng UIImage và cho nó đường dẫn đến một tập tin, nó có thể không tải toàn bộ hình ảnh vào bộ nhớ cho đến khi bạn vẽ nó. Nếu bạn tải tập tin vào bộ nhớ bằng cách sử dụng một đối tượng NSData, sau đó vượt qua THAT để UIImage, nó không có sự lựa chọn, nhưng để giữ nó trong bộ nhớ. Điều tốt nhất phụ thuộc vào tình hình cụ thể. – benzado