2010-09-29 39 views
6

Làm cách nào để gọi một phương thức tĩnh một cách không đồng bộ?Làm thế nào tôi có thể gọi một phương thức tĩnh Objective-c không đồng bộ?

+ (void) readDataFromServerAndStoreToDatabase 
{ 
    //do stuff here 
    //might take up to 10 seconds 
} 
+0

Không có phương pháp tĩnh như vậy. Đây là một ví dụ về một phương thức lớp được gửi đến lớp, không phải là một cá thể. Lưu ý làm thế nào nó vẫn được gửi đến một cái gì đó. Điều đó sẽ cho bạn một đầu mối làm thế nào để làm những gì bạn muốn (hoặc đọc câu trả lời của mipadi). – JeremyP

Trả lời

16

Sử dụng một NSThread:

[NSThread detachNewThreadSelector:@selector(readDataFromServerAndStoreToDatabase) 
         toTarget:[MyClass class] 
         withObject:nil]; 
+0

Không biết tại sao điều này lại bị bỏ phiếu. Nó ngắn gọn và trực tiếp trả lời câu hỏi. – bbum

+0

Tôi đồng ý như vậy + 1. – JeremyP

3

Bạn có thể sử dụng this method chống lại các đối tượng lớp. Giả sử bạn có

@interface MyClass:NSObject{ 
.... 
} 
+ (void) readAndStoreDataToDatabase; 
@end 

và sau đó làm

NSThread*thread=[NSThread detachNewThreadSelector:@selector(readAndStoreDataToDatabase) 
              target:[MyClass class] 
             withObject:nil ]; 

Lưu ý rằng đối tượng lớp của một lớp kế thừa từ NSObject là một NSObject, vì vậy bạn có thể vượt qua nó để các phương pháp này. Xem một mình bằng cách chạy chương trình này:

#import <Foundation/Foundation.h> 

int main(){ 
    NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
    NSString* [email protected]"foo"; 
    if([foo isKindOfClass:[NSObject class]]){ 
     NSLog(@"%@",@"YES"); 
    }else{ 
     NSLog(@"%@",@"NO");  
    } 
    if([[NSString class] isKindOfClass:[NSObject class]]){ 
     NSLog(@"%@",@"YES"); 
    }else{ 
     NSLog(@"%@",@"NO");  
    } 
    [pool drain]; 
} 

Điểm chính là, trong Objective-C, các phương thức lớp (được gọi là phương thức tĩnh trong C++) chỉ là các phương thức chuẩn được gửi tới đối tượng lớp. Để biết thêm về các đối tượng lớp học, hãy xem các bài đăng trên blog tuyệt vời này theo số Hamster và theo số Cocoa with Love.

+0

Đúng, nhưng tôi cược rằng người hỏi không biết họ đã giao bao nhiêu sợi dây. ;) – bbum

+0

Tôi làm, tôi đã làm rất nhiều luồng trước, tôi chỉ không biết nó có thể gọi một phương pháp tĩnh thông qua một sợi, do đó, từ khóa ở đây là [MyClass class] – aryaxt

+0

Không có thứ gì như một ' static' method trong Objective-C :) Chúng là 'class methods', và chúng được gửi' dynamicically' tới đối tượng class. Một khi bạn nhận được rằng, nó hoàn toàn tự nhiên mà bạn có thể làm điều này. – Yuji

6

Có một số cách để thực hiện đồng thời trong mục tiêu-C, tùy thuộc vào môi trường bạn đang chạy. Các khối, các khối NSThreads, NSOperations, GCD & đều có vị trí của chúng. Bạn nên đọc "Hướng dẫn lập trình đồng thời" của Apple cho bất kỳ nền tảng nào bạn đang nhắm mục tiêu.

+0

+1 để đề cập đến nhiều tùy chọn và hướng dẫn có liên quan –

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