Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Hiển thị ảnh lên UIScrollview lỗi: Terminating app due to uncaught exception ... was mutated while being enumerated?

    Chương trình mình viết để hiển thị ảnh lên UIScrollview. kiểu gallery image.

    Lỗi crash trong lúc mình load ảnh (phần lớn load không sao thỉnh thoảng mới bắn ra lỗi.)


    *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x4e68720> was mutated while being enumerated.(
    mỗi khi người dùng kéo UIScrollview đến 1 vị trí nhất định mình sẽ cho send SOAP request đến Service để nhận về 10 link ảnh .
    mỗi khi nhận được thông tin ảnh + link ảnh mình lưu vào 1 object sau đó add vào 1 NSMutableArray.
    sau đó trong hàm hiển thị ảnh mình xác định vị trí ảnh hiển thị trong uiscrollview sau đó Add 1 uiimageview vào vị trí đó. Với mỗi ảnh mình tạo 1 thread để load ảnh đó :


    Mã:
    NSThread *thread_ = [NSThread alloc];        [thread_ initWithTarget:self                        selector:@selector(DisplayAImage:)                         object: ip]; // ip là đối tượng chứa thông tin ảnh        [threads addObject:thread_];        [thread_ start];        [thread_ release];
    Đây là function để load mỗi ảnh (load ảnh từ link nếu ảnh không có trong bộ nhớ nếu không hiển thị ảnh trong bộ nhớ máy.):


    Mã:
    - (void) DisplayAImage:(ImagePosition *)ip{    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    ImagePosition *newIp = [ip copy];    UIImage *image;    NSData *data;    NSFileManager *fileManager = [NSFileManager defaultManager];    if(![fileManager fileExistsAtPath:[self PathOfFile:newIp.imageID]]) {        NSURL *url = [[NSURL alloc] initWithString:newIp.imageUrl];        [[NSURLCache sharedURLCache] setMemoryCapacity:0];        [[NSURLCache sharedURLCache] setDiskCapacity:0];         data = [[NSData alloc] initWithContentsOfURL:url];        [url release];        [data writeToFile:[self PathOfFile:newIp.imageID] atomically:YES];            }else{        data = [[NSData alloc] initWithContentsOfFile:[self PathOfFile:newIp.imageID]];        NSLog(@"Cache . . . . . . . ");    }    image = [[UIImage alloc] initWithData:data];    [data release];    UIImageView *image1 = (UIImageView*)[myScrollView viewWithTag:newIp.imageID];    [image1 setImage:image];    [image release];    [pool release];}
    Đây là full lỗi hiện ra ở debug.


    *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x4e68720> was mutated while being enumerated.(
    "<CALayer: 0x4e686f0>",
    "<CALayer: 0x4b5d490>",
    "<CALayer: 0x4b8a220>",
    "<CALayer: 0x4b16df0>",
    "<CALayer: 0x4e65250>",
    "<CALayer: 0x4e4c7e0>",
    "<CALayer: 0x4e33590>",
    "<CALayer: 0x4b99430>",
    "<CALayer: 0x4bac290>",
    "<CALayer: 0x4b385d0>",
    "<CALayer: 0x4b6b4b0>",
    "<CALayer: 0x4e73220>",
    "<CALayer: 0x4e39600>",
    "<CALayer: 0x4b93cf0>",
    "<CALayer: 0x4b6c000>",
    "<CALayer: 0x4e708e0>",
    "<CALayer: 0x4e40430>",
    "<CALayer: 0x4b38e30>",
    "<CALayer: 0x4e67b00>",
    "<CALayer: 0x4e53b20>",
    "<CALayer: 0x4e71690>",
    "<CALayer: 0x4b6c910>",
    "<CALayer: 0x4b96170>",
    "<CALayer: 0x4ba46e0>",
    "<CALayer: 0x4e43010>",
    "<CALayer: 0x4e41550>",
    "<CALayer: 0x4b992b0>",
    "<CALayer: 0x4b5f2e0>",
    "<CALayer: 0x4b98440>",
    "<CALayer: 0x4e68580>",
    "<CALayer: 0x4b90ab0>",
    "<CALayer: 0x4b33ca0>",
    "<CALayer: 0x4b87090>",
    "<CALayer: 0x4babf20>",
    "<CALayer: 0x4b69b20>",
    "<CALayer: 0x4e67380>",
    "<CALayer: 0x4e38a30>",
    "<CALayer: 0x4b18040>",
    "<CALayer: 0x4b82d70>",
    "<CALayer: 0x4b34140>",
    "<CALayer: 0x4e62fd0>",
    "<CALayer: 0x4b670a0>",
    "<CALayer: 0x4b9abb0>",
    "<CALayer: 0x4e48640>",
    "<CALayer: 0x4e6ad20>",
    "<CALayer: 0x4b311e0>",
    "<CALayer: 0x4b61470>",
    "<CALayer: 0x4e74340>",
    "<CALayer: 0x4b9a390>",
    "<CALayer: 0x4b8c9e0>",
    "<CALayer: 0x4e487c0>",
    "<CALayer: 0x4b301c0>",
    "<CALayer: 0x4b86d80>",
    "<CALayer: 0x4e6c440>",
    "<CALayer: 0x4b8e840>",
    "<CALayer: 0x4b60d40>",
    "<CALayer: 0x4e65020>",
    "<CALayer: 0x4e3d960>",
    "<CALayer: 0x4e50060>",
    "<CALayer: 0x4e6cdb0>",
    "<CALayer: 0x4b38360>",
    "<CALayer: 0x4e38710>",
    "<CALayer: 0x4e4bc60>",
    "<CALayer: 0x4b96340>",
    "<CALayer: 0x4bb1440>",
    "<CALayer: 0x4e5d130>",
    "<CALayer: 0x4e61bb0>",
    "<CALayer: 0x4b60270>",
    "<CALayer: 0x4b378a0>",
    "<CALayer: 0x4b7c010>",
    "<CALayer: 0x4e3b280>",
    "<CALayer: 0x4e464f0>",
    "<CALayer: 0x4e467e0>",
    "<CALayer: 0x4e5fe60>",
    "<CALayer: 0x4b7ba80>",
    "<CALayer: 0x4b3c490>",
    "<CALayer: 0x4b99640>",
    "<CALayer: 0x4e43e10>",
    "<CALayer: 0x4e5d840>",
    "<CALayer: 0x4bb2110>",
    "<CALayer: 0x4e38cc0>",
    "<CALayer: 0x4b7e6f0>",
    "<CALayer: 0x4e5dce0>",
    "<CALayer: 0x4b3be20>",
    "<CALayer: 0x4e6fe20>",
    "<CALayer: 0x4e5a4f0>",
    "<CALayer: 0x4e6d010>",
    "<CALayer: 0x4e6d160>",
    "<CALayer: 0x4e606d0>",
    "<CALayer: 0x4e703b0>",
    "<CALayer: 0x4e5a580>",
    "<CALayer: 0x4b31db0>",
    "<CALayer: 0x4b74ea0>",
    "<CALayer: 0x4b853c0>",
    "<CALayer: 0x4b98d20>",
    "<CALayer: 0x4b8bc80>",
    "<CALayer: 0x4b96ed0>",
    "<CALayer: 0x4b962b0>",
    "<CALayer: 0x4e5ac10>",
    "<CALayer: 0x4e717e0>",
    "<CALayer: 0x4b7a7a0>",
    "<CALayer: 0x4e41030>",
    "<CALayer: 0x4e4aef0>",
    "<CALayer: 0x4e3efe0>",
    "<CALayer: 0x4b7f1f0>",
    "<CALayer: 0x4e6f050>",
    "<CALayer: 0x4e4d5d0>",
    "<CALayer: 0x4b82a30>",
    "<CALayer: 0x4b77910>",
    "<CALayer: 0x4b6adf0>",
    "<CALayer: 0x4e46c60>",
    "<CALayer: 0x4e5cae0>",
    "<CALayer: 0x4b81ac0>",
    "<CALayer: 0x4b83150>",
    "<CALayer: 0x4b43bb0>",
    "<CALayer: 0x4b7a320>",
    "<CALayer: 0x4e61e90>",
    "<CALayer: 0x4e6b4e0>",
    "<CALayer: 0x4e61ef0>"
    )'
    *** Call stack at first throw:
    (
    0 CoreFoundation 0x00f405a9 __exceptionPreprocess + 185
    1 libobjc.A.dylib 0x01094313 objc_exception_throw + 44
    2 CoreFoundation 0x00f40069 __NSFastEnumerationMutationHandler + 377
    3 UIKit 0x001cc26e -[UIView(Hierarchy) viewWithTag:] + 219
    4 MyApp 0x0000481a -[MyAppViewController DisplayAImage:] + 1210
    5 Foundation 0x00904cf4 -[NSThread main] + 81
    6 Foundation 0x00904c80 __NSThread__main__ + 1387
    7 libSystem.B.dylib 0x9043e259 _pthread_start + 345
    8 libSystem.B.dylib 0x9043e0de thread_start + 34
    )
    terminate called after throwing an instance of 'NSException'
    Qua search thu thập được 1 số lỗi do sử dụng biến toàn cục trong thread, truy xuất + sửa Array cùng lúc. nhưng nhìn lại code mình không phát hiện được ra chỗ nào

    Ai đã từng gặp vấn đề này help với [IMG]images/smilies/Cry.gif[/IMG]

    Thanks and Best Regards.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình cũng mới bắt đầu tìm hiểu về Obj C , hôm cũng có làm 1 cái sample về UIscrollView , nhưng mình làm theo video hương giẫn [IMG]images/smilies/biggrin.png[/IMG] . Ko thấy lỗi , nếu vẫn ko sửa đc thì bạn có thể search các video tutorial xem sao .
    Chứ nói thế này + mình cũng mới lọ mọ Obj C nên chỉ dám góp ý tý thui [IMG]images/smilies/biggrin.png[/IMG].
    Chúc bạn thành công [IMG]images/smilies/smile.png[/IMG] .

  3. #3
    Search hoài cũng được cái này :


    You must not try to modify the UI on a separate thread. UI should only be manipulated on the main thread.

    Instead of detaching a new thread, you should use performSelectorOnMainThread:withObject:waitUntilDo ne:. This will ensure that the method will be called on the proper thread.
    Và đã giải quyết được bằng cách load ảnh trong main thread.

    Tuy nhiên chương trình hoạt động không được mượt như trước

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi ngocsonaat
    Mình cũng mới bắt đầu tìm hiểu về Obj C , hôm cũng có làm 1 cái sample về UIscrollView , nhưng mình làm theo video hương giẫn [IMG]images/smilies/biggrin.png[/IMG] . Ko thấy lỗi , nếu vẫn ko sửa đc thì bạn có thể search các video tutorial xem sao .
    Chứ nói thế này + mình cũng mới lọ mọ Obj C nên chỉ dám góp ý tý thui [IMG]images/smilies/biggrin.png[/IMG].
    Chúc bạn thành công [IMG]images/smilies/smile.png[/IMG] .
    mấy cái tuttorial chỉ demo đơn giản thôi bạn cái reply thứ 2 của t đã giúp t biết được chính xác nguyên nhân, giờ chỉ còn tìm cách giải quyết sao cho vẫn mượt như lúc sử dụng thread lại không bị crash như như không sử dụng thread để load ảnh [IMG]images/smilies/smile.png[/IMG] trong đầu đã có ý tưởng rồi , mai lên cty thử xem thế nào [IMG]images/smilies/biggrin.png[/IMG] giờ ngủ đã [IMG]images/smilies/smile.png[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •