iPhone ios đang chạy trong chuỗi riêng biệt


96

Cách tốt nhất để chạy mã trên một chuỗi riêng là gì? Là nó:

[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];

Hoặc là:

    NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(doStuff:)
                                                                          object:nil;
[queue addOperation:operation];
[operation release];
[queue release];

Tôi đã làm theo cách thứ hai nhưng Sách dạy nấu ăn Wesley mà tôi đang đọc sử dụng cách đầu tiên.

Câu trả lời:


243

Theo tôi, cách tốt nhất là sử dụng libdispatch, hay còn gọi là Grand Central Dispatch (GCD). Nó giới hạn bạn ở iOS 4 trở lên, nhưng nó rất đơn giản và dễ sử dụng. Mã để thực hiện một số xử lý trên một chuỗi nền và sau đó làm điều gì đó với kết quả trong vòng chạy chính cực kỳ dễ dàng và nhỏ gọn:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Add code here to do background processing
    //
    //
    dispatch_async( dispatch_get_main_queue(), ^{
        // Add code here to update the UI/send notifications based on the
        // results of the background processing
    });
});

Nếu bạn chưa làm như vậy, hãy xem các video từ WWDC 2010 trên libdispatch / GCD / blocks.


Tôi cần nó để được 3.0 tương thích :(
Mike S

1
Sau đó, hàng đợi hoạt động có lẽ là giải pháp tốt nhất tiếp theo. Ngoài ra, hãy đảm bảo rằng bạn không đi sâu vào đồng thời quá nhanh. Hãy thử bắt đầu bằng cách viết những thứ đơn luồng và hồ sơ để xem bạn có cần phải chuyển sang đa luồng hay không, hoặc liệu bạn có thể tự thiết kế mã đơn luồng của mình để hiệu quả hơn không. Đối với các tác vụ đơn giản, đôi khi bạn có thể làm mọi thứ bạn cần với PerformSelector: withObject: afterDelay: và tránh tất cả các vấn đề xảy ra với lập trình đa luồng.
Jacques

Xin lỗi vì đã khôi phục điều này rất nhiều sau đó, nhưng nếu tôi sinh ra một lệnh gọi phương thức với PerformSelector: withObject: afterDelay, tôi có cần sử dụng NSAutoReleasePool bên trong phương thức async không? Nếu nó sử dụng một cách kỳ diệu nhóm phát hành tự động chính thì performanceSElector: afterDelay chắc chắn là một tùy chọn nhanh hơn.
Mike S

Không, bởi vì phương thức đang được chạy trên luồng chính, có nhóm tự động khôi phục riêng của nó.
Jacques

4
@Joe Có rủi ro khi nói những điều bạn đã biết, bạn không nên có thói quen viết mã giết chết các chủ đề, nó sẽ không giúp ích gì cho bạn và sự nghiệp của bạn về lâu dài. Xem bài đăng này (hoặc nhiều người thích nó) để biết lý do tại sao không giết chủ đề.
MikeC

1

Cách tốt nhất để đa luồng trong iOS là sử dụng GCD (Grand Central Dispatch).

//creates a queue.

dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);

dispatch_async(myQueue, ^{
    //stuffs to do in background thread
    dispatch_async(dispatch_get_main_queue(), ^{
    //stuffs to do in foreground thread, mostly UI updates
    });
});

0

Tôi sẽ thử tất cả các kỹ thuật mà mọi người đã đăng và xem cách nào là nhanh nhất, nhưng tôi nghĩ đây là cách tốt nhất để làm điều đó.

[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];

điều này sẽ khởi chạy chuỗi ở mức độ ưu tiên thấp. Sử dụng gcd là cách tốt nhất để phân luồng.
Karsten

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.