2011-10-17 27 views
7

Tôi có một dự án tải hình ảnh xuống dưới nền sử dụng NSOperationQueue. Nó đã làm việc cho đến bây giờ trên các thiết bị với IOS 4.3. Tuy nhiên nếu tôi xây dựng các ứng dụng với sdk 4.3 cơ sở hoặc với 5 và chạy các ứng dụng trên thiết bị với IOS5, các ứng dụng bị treo. Khi ứng dụng được khởi chạy, nó sẽ thêm NSOperation đối tượng vào hàng đợi để tải xuống hình ảnh. Nếu ở giữa tôi bấm lại nút, tôi hủy NSOperation và nó bị treo và hiển thị sau dấu vết trên console:NSOperationQueue không hoạt động trong IOS5

 
#0 0x004727b7 in ____NSOQSchedule_block_invoke_0() 
#1 0x026a5618 in _dispatch_call_block_and_release() 
#2 0x026a7a10 in _dispatch_worker_thread2() 
#3 0x974bb781 in _pthread_wqthread() 
#4 0x974bb5c6 in start_wqthread() 

và in "ResourceLoadOperation isFinished = YES mà không bị bắt đầu bởi hàng đợi đó là trong" Nếu tôi nhận xét cuộc gọi phương thức hủy, ứng dụng không bị lỗi. Có bất kỳ cập nhật nào về các thay đổi NSOperation cho IOS5 không?

+0

Tôi gặp vấn đề tương tự. Bình luận về việc phát hành đối tượng NSOperation làm cho thủ thuật, như bạn đã nói, nhưng tôi không chắc chắn rằng quản lý bộ nhớ là đúng trong trường hợp này ... –

+0

Chỉ cần bình luận phương thức hủy có thể không đúng về mặt quản lý bộ nhớ. Nhưng đó có phải là một vấn đề về tốc độ xử lý trong ios 5 đang gây ra vấn đề này vì cùng một công trình tốt trên các thiết bị IOS 4.3? – CKT

Trả lời

12

Tôi có vấn đề này tương tự khi xây dựng đối với iOS 5. Tôi đã kết thúc việc tạo ra một lá cờ mang tên operationStarted đó là NO theo mặc định và tôi bật lên thành YES khi các phương pháp start được gọi. Sau đó, trong phương thức finish của tôi (nơi tôi tạo thông báo KVO), tôi đã kiểm tra giá trị của cờ trước khi kích hoạt thông báo.

Định nghĩa cờ trông như thế này:

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted; 

Các start phương pháp:

- (void)start { 
    [self setOperationStarted:YES]; 
    ... 
} 

Phương pháp của tôi finish được gọi là khi hoạt động là hoàn chỉnh hoặc hủy bỏ:

- (void)finish {  
    if (![self isOperationStarted]) return; 

    [self willChangeValueForKey:@"isExecuting"]; 
    executing = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

Điều đó đã kết thúc giải quyết vấn đề cho tôi. Hy vọng nó sẽ giúp người khác.

+0

Tôi tò mò tại sao bạn thậm chí cần thuộc tính operationStarted khi bạn đã có isexecuting cho cùng một mục đích? –

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