2013-04-10 33 views
19

Tôi khá mới trong việc phát triển iOS nhưng tôi bắt đầu nắm bắt một số khái niệm phức tạp hơn. Tôi hiện đang có một ứng dụng triển khai AVCam để quay video. AVCam được tạo trên một chuỗi riêng biệt, nhưng sử dụng chế độ xem trong tệp xib chính của tôi. Khi máy ảnh được chụp xong, nó gọi một hàm hoàn chỉnh trong lớp ViewController của tôi. Trong hàm đầy đủ, tôi gọi một số hàm khác cập nhật giao diện người dùng cũng như một vài NSLog. Mọi thứ dường như hoạt động tốt, tôi thấy các nhật ký trong bảng điều khiển ngay lập tức, nhưng giao diện người dùng mất thêm 3 giây để cập nhật. Tôi đã thử sử dụng các công cụ để tìm mã vi phạm, nhưng tôi dường như không thể tìm thấy nó. Có cách nào khác để xác định nội dung nào bị chặn bởi giao diện người dùng không?iOS Cách xác định nội dung nào đang chặn giao diện người dùng

Đây là mã được gọi khi quá trình ghi hoàn tất;

-(void)movieRecordingCompleted{ 
     [HUD hide:YES]; 
     NSLog(@"movieRecordingCompleted"); 
     [self showModalViewController]; 
     NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"]; 
     NSLog(@"pathToMovie: %@", pathToMovie); 
     pathToTreatedVid = pathToMovie; 
     NSLog(@"File Save Called"); 
     UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL); 
} 

Mọi thứ được ghi lại ngay lập tức nhưng tiến trình HUD và bộ điều khiển chế độ không kích hoạt trong khoảng 2 - 5 giây, rất lạ.

Đây là trạng thái trước và sau của luồng (khi được cố định so với khi nó bị đóng băng). enter image description here enter image description here

+0

Vui lòng hiển thị một số mã nơi bạn cập nhật giao diện người dùng. –

Trả lời

-7

Tôi thích sử dụng chức năng này:

sleep(x); 

nơi "x" là số giây ... nó sẽ chỉ đơn giản là chặn bất cứ chủ đề nó chạy trên cho rằng số giây. Nếu giao diện người dùng của bạn bị đóng băng, bạn biết bạn đã chặn luồng chính và do đó mã đó đang được chạy trên luồng chính (cho dù bạn có dự định hay không). Hãy thử thực hiện cuộc gọi này ở những nơi khác nhau trong mã của bạn và nó sẽ giúp bạn chẩn đoán những gì đang xảy ra. Hy vọng rằng sẽ giúp.

+1

Bạn có thể tìm ra chính xác phương thức mà một phương thức đang được chạy một cách đơn giản bằng cách đặt một điểm ngắt trong đó. Xcode sẽ làm nổi bật chuỗi trong bảng điều khiển bên trái khi nó chạm vào điểm ngắt. – Ash

7

Bạn có thể sử dụng Time Profiler để tìm hiểu điều gì đang chặn ứng dụng của bạn.

+0

Tôi đã cố gắng sử dụng trình biên dịch thời gian, khi tôi thực hiện, tôi thấy quy trình của tôi xoay vòng một chuỗi mới và thời gian chạy trên mối đe dọa đó tăng lên. Khi quá trình này được "thực hiện" tức là khi tôi thấy hàm hoàn chỉnh của tôi được gọi, thời gian dừng dừng tăng lên ... nhưng hàm chính không bắt đầu tăng dần. nó giống như các ứng dụng chỉ được đông lạnh tạm thời vì lý do nào đó – user379468

38

Cố gắng Tạm dừng thực hiện chương trình (có một nút cho rằng trong bảng dưới cùng của Xcode, thứ ba một)

Pause

  • Sau đó nhìn vào bảng điều khiển bên trái (Navigator panel),
  • Tìm Debug Navigator

Debug Navigator

  • Tìm chủ đề với chức năng main và mb bạn có thể tìm ra bằng các phương pháp trong chuỗi này, quá lâu để cập nhật giao diện người dùng của bạn. Phương pháp đang hoạt động ngay bây giờ là màu đen trên cùng (với màu xám được liệt kê obj-c phương thức nội bộ).

main

+1

Cách tiếp cận này có thể mất một vài lần thử trước khi cho ra kết quả hữu ích, vì vậy hãy chắc chắn rằng bạn kiên nhẫn. – Tim

+0

Tôi vừa thử phương pháp này, khi giao diện người dùng bị "đóng băng", tôi thấy một số luồng (khi sắp xếp theo hàng đợi). Chính (com.apple.main) được gọi là RemoteClientNotifyQueue và được gọi là com.apple.libdispatch-manager nhưng tôi không thực sự chắc chắn về cách thông tin đó giúp tôi – user379468

+0

@Ossir Tôi đã tạm dừng ứng dụng ở trạng thái tạm thời bị đóng băng và sau đó sau khi nó trở nên đáp ứng, nó seams sự khác biệt là 3 chủ đề, chính xác những gì họ đang làm vẫn còn là một bí ẩn đối với tôi. (xem hình đính kèm) – user379468

3

Bạn có thể sử dụng công cụ Dấu vết hệ thống trong Instruments bằng cách chạy ứng dụng của bạn trong chế độ profile. Sau đó, bạn sẽ nhận được một chi tiết chạy xuống của tất cả các chủ đề trong hệ thống cùng với ngăn xếp dấu vết tại mỗi sự kiện lập lịch trình chủ đề đi qua.

Có một video tuyệt vời từ 2016 WWDC System Trace in Depth sẽ hướng dẫn bạn gỡ lỗi một vấn đề về chuỗi bị chặn.

Điều này tốt hơn nhiều so với công cụ Thời gian Profiler từ đó, công cụ này hoạt động dựa trên việc lấy mẫu những gì đang chạy trên CPU trong các khoảng thời gian. Tuy nhiên, nếu chuỗi của bạn bị chặn, nó không chạy trên CPU, vì vậy - nó sẽ không được lấy mẫu. Bạn có thể có chủ đề chính của bạn bị chặn cho một toàn bộ thứ hai nhưng nó sẽ không hiển thị trong thời gian Profiler.

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