2011-02-09 29 views
8

một trong những nguyên lý trung tâm của kiến ​​trúc ứng dụng mới nhất của tôi là tôi sẽ gọi các phương thức trên mô hình của ứng dụng sẽ không đồng bộ. khối.Gọi phương thức mô hình với khối sẽ chạy trên chủ đề chính

tức là, giao diện người dùng gọi phương thức mô hình với 2 khối, một cho thành công và một cho thất bại.

Điều này thật tuyệt vì ngữ cảnh của cuộc gọi ban đầu được giữ lại, tuy nhiên, chính khối đó được gọi trên chuỗi nền. Có anyway gọi một khối trên các chủ đề chính ??

Hy vọng rằng tôi đã giải thích nó ok, nếu không, về cơ bản, phương pháp mô hình của tôi là không đồng bộ, trả về ngay lập tức và tạo một chủ đề mới để chạy op. Khi op trả về, tôi sẽ gọi một khối sẽ postprocess dữ liệu trả về, THEN tôi cần gọi khối cho kịch bản thành công được xác định bởi bên trong giao diện người dùng. Tuy nhiên, các khối kịch bản thành công và thất bại được xác định trong giao diện người dùng nên được gọi trong chuỗi chính vì tôi cần tương tác với các phần tử giao diện người dùng chỉ nên được thực hiện trên luồng chính mà tôi tin.

cảm ơn nhiều

Trả lời

36

Something như thế này có lẽ là những gì bạn đang sau:

- (void) doSomethingWhichTakesAgesWithArg: (id) theArg 
          resultHandler: (void (^)(BOOL, id, NSError *)) handler 
{ 
    // run in the background, on the default priority queue 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     id someVar = [theArg computeSomething]; 

     NSError * anError = nil; 
     [someVar transmuteSomehowUsing: self error: &anError]; 

     // call the result handler block on the main queue (i.e. main thread) 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // running synchronously on the main thread now -- call the handler 
      handler((error == nil), theArg, anError); 
     }); 
    }); 
} 
5

NSObject có một phương pháp:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 

Tạo một phương pháp mà phải mất một tham số NSDictionary trong một lớp học thuận tiện mà sẽ luôn luôn được xung quanh (như đại biểu ứng dụng của bạn, hoặc một đối tượng singleton) , gói lên các khối và các thông số của nó thành một NSDictionary hoặc NSArray, và gọi

[target performSelectorOnMainThread:@selector(doItSelector) withObject:blockAndParameters waitUntilDone:waitOrNot]; 
10

Nếu bạn đang sử dụng GCD, bạn có thể sử dụng "được hàng đợi chính":

dispatch_queue_t dispatch_get_main_queue() 

Gọi bên trong một công văn không đồng bộ. tức là

dispatch_async(dispatch_get_main_queue(), ^{ 
    /* Do somthing here with UIKit here */ 
}) 

Khối mẫu ở trên có thể chạy trong hàng đợi nền không đồng bộ và mã ví dụ sẽ gửi giao diện người dùng làm việc với chuỗi chính.

6

cách tiếp cận tương tự cũng làm việc với NSOperationQueue:

NSBlockOperation *aOperation = [NSBlockOperation blockOperationWithBlock:^ 
{ 
    if (status == FAILURE) 
    { 
     // Show alert -> make sure it runs on the main thread 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^ 
     { 
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Your action failed!" delegate:nil 
             cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease]; 
      [alert show]; 
     }]; 
    } 
}]; 

// myAsyncOperationQueue is created somewhere else 
[myAsyncOperationQueue addOperation:aOperation]; 
Các vấn đề liên quan